Java中的try-catch-finally异常处理

一、异常处理

异常(Exception):是在运行发生的不正常情况。

原始异常处理:

if(条件)
{
  处理办法1
  处理办法2
  处理办法3
}
if(条件)
{
  处理办法4
  处理办法5
  处理办法6
}

  代码阅读性差,臃肿不堪,与正常流程代码结合的很紧密,所以,在JAVA中进行一系列的改良,将一系列常见的问题,用面向对象的思考方式,对其进行了描述、封装。

class 处理办法
{
处理办法1()
{
举例1
}
处理办法2()
{
举例2
}
}
if(出错了)
{
  抛出 new 处理办法1();此方法可能包含问题的名称,信息,时间,地点等。
}

  

在JAVA中,用类的形式对不正常情况进行了描述和封装对象。当程序出现问题时,调用相应的处理办法。

描述不正常情况的类,就称为异常类。将流程代码和异常代码进行分离。

异常就是JAVA通过面向对象的思想,将问题封装成了对象。用异常类对其进行描述。不同的问题,用不同的类进行描述。那么意味着,问题有多少,类就有多少。

二、异常体系

问题很多,意味着描述的类也很多,将其共性进行向上抽取,就形成了异常体系。最终异常分为两大类

Throwable(父类):问题发生,就应该抛出,让调用者处理。该体系的特点就在于Throwable及其子类都具有可抛性。

  两个关键字实现可抛性:throws、throw

1.一般不可处理的。Error(错误)

  特点:是由JVM(java虚拟机)抛出的严重性的问题。这种问题发生,一般不针对性处理,直接修改程序。

2.可以处理的。Exception(异常)

  特点:子类的后缀名都是用其父类名作为后缀,阅读性很强。

三异常-原理&异常对象的抛出throw

public static void main(String [] args)
{
代码块  throw new 异常方法();
}
throw为关键字,专门用于抛出异常动作。 定义中文异常信息(举个例子):
throw new 异常方法(异常的方法一般里面可以放入String类型的字符串的,在这里写上中文提示就OK了);

  

可以看出,异常时,底层throw直接调用异常方法,抛出异常,只不过这些都在底层完成,我们看不到而已。

JAVA虚拟机它有一套异常处理机制,就是会把异常的各种信息,位置等报出来,以供解决异常。

真正开发的时候,这些异常信息是不会直接报出来的,会存成日志,我们定期查看。而且这个异常信息给用户也没用,只有给我们才有用。

四、异常-自定义异常&异常类的抛出throws

自定义异常:JAVA给出的一堆现有的异常没有我们需要的,这时候可以自定义了。但是这个类一定要继承Exception类

这是自定义的异常,需要继承Exception类
class Demo extends Exception
{
异常的构造方法嘛
Demo()
{
}
Demo(int a)
{
super(a);这是Throwable父类写好的方法,Exception继承的是Throwable父类
}
Demo(String b)
{
super(b);
}
} class Demo1
{
public static void main(String [] args) throws Demo 注意这里是throws抛出,要在方法上声明异常,直接后边写就行
{
throw new Demo(这里写上你的中文异常提示);
}
}

  

五、异常-编译时检测异常和运行时异常的区别&throw和throws的区别

Exception体系分两种:1.一种是编译时被检测异常(throws)。除runtimeException子类的所有子类。这样的问题可以针对性的处理。

2.运行时异常(throw)。Exception的子类中runtimeException和其子类。这种问题一般不处理,直接编译通过,在运行时让调用时的程序强制停止。

六、异常-异常捕捉try-catch

异常处理的捕捉形式:具体格式:

try尝试
{
  需要被检测异常的代码
  不要啥玩意都往try里放,不需要检测的不用放
}
catch(异常类 变量)-这个变量专门接收当前发生异常的对象
{
  处理异常的代码,问题解决了,程序继续运行
}
finally最终化
{
  一定会被执行的代码
}

  

七、异常-多catch情况

try尝试
{
  需要被检测异常的代码
}
catch(异常类 变量)
{
  处理异常的代码
}
catch(异常类 变量)
{
  处理异常的代码
}
finally最终化
{
  一定会被执行的代码
}

  

一个try对应多个catch的时候,小细节:

当多catch需要存在catch(Exception e)的时候,需要放到最后,不然会挂,因为Exception为父类,能接收所有的异常,放它之后,其他的就多余了,所以,它要放在最后的catch。

八、异常-异常处理原则

异常就是问题,JAVA对一些常见的问题已经弄好了,拿来用就好了。

如果,个别问题只在你自己的项目里出现,并且JAVA里没有这类问题,那就需要自己描述该问题。

1.方法内如果抛出需要检测的异常,那么方法上必须要声明,否则必须在方法内用try-catch捕捉,否则编译失败。

2.如果调用了声明异常的函数,要么try-catch要么throws,否则编译失败。

3.什么时候catch,什么时候throws?功能内容可以解决,用catch,解决不了,用throws告诉调用者,有调用者解决。

4.如果一个功能抛出了多个异常,那么调用时必须有对应多个catch进行针对性的处理。

九、异常-finally代码块

finally为一定会执行的代码,只有一种情况,finally不会执行。

try
{
检测代码
}
catch
{
  return; 退出整个方法,但finally依旧执行。
  System.exit(0);退出java虚拟机,只有这种情况finally不会执行。
}
finally 通常用于关闭(释放)资源
{
  除退出虚拟机一种情况外,不管咋地,都会执行。
}
System.out.println("catch中写有return,finally外的代码将不会执行,确切的说,就是直接退出了整个方法");

  

try-catch-finally代码块组合特点:

1.try-catch-finally常见组合体

2.try-catch(可以多个catch)没有finally,没有资源需要释放(关闭),可以不用finally。

3.try-finally,没有catch时,方法旁边需要throws声明,因为没catch没处理。异常无法直接catch处理,但是资源需要关闭,这时用此组合。

十、异常的注意事项

1.子类在覆盖父类方法时,父类的方法如果抛出了异常,那么子类的方法只能抛出父类的异常或者该异常的子类。

2.如果父类抛出多个异常,那么子类只能抛出父类异常的子集。----子类覆盖父类只能抛出父类异常或者子类或者子集。如果父类的方法没有抛出异常,那么子类覆盖时绝对不能抛,只能try。

常用异常方法:

Error类的常见子类:

Exception类的常见子类:

RuntimeException类的常见的子类:

Java中的try-catch-finally异常处理的更多相关文章

  1. 在java中的Try Catch块-------------异常处理(2)

    1. Try块是什么? Try块是一块可能产生异常的代码块,一个Try块可能跟着Catch块或者Finally块,或者两者. Try块的语义: try{ //statements that may c ...

  2. [转载]java中try 与catch的使用

    留着以后看 原文地址:与catch的使用">java中try 与catch的使用作者:碌碌如玉 try{ //代码区 }catch(Exception e){ //异常处理 } 代码区 ...

  3. 【Java学习笔记之三十三】详解Java中try,catch,finally的用法及分析

    这一篇我们将会介绍java中try,catch,finally的用法 以下先给出try,catch用法: try { //需要被检测的异常代码 } catch(Exception e) { //异常处 ...

  4. Java 中 try、catch、finally 语句块的执行顺序

    假设代码顺序书写如下:try → catch → finally → 其他代码 则: 1.正常执行顺序:try → catch → finally → 其他代码 2.try,catch和finally ...

  5. JavaScript中的try...catch和异常处理

    在JavaScript可以使用try...catch来进行异常处理.例如: try { foo.bar();} catch (e) { alert(e.name + ": " + ...

  6. java中try 与catch的使用

    (2011-10-08 17:08:43) 转载▼ 标签: 杂谈 分类: Java try{//代码区}catch(Exception e){//异常处理}代码区如果有错误,就会返回所写异常的处理. ...

  7. 你真的理解Java中的try/catch/finally吗?

    看几个例子,回顾一下执行顺序 例子1 无异常,finally中的return会导致提前返回 public static String test() {    try {        System.o ...

  8. Java中的try catch finaly先后调用顺序

    自我总结,有什么不足或好的方案,希望大家给予纠正,感激不尽! 目的:try catch finaly的顺序执行,和大家复习一遍. 方法:debug来确认执行顺序.(需要引入junit包) 废话不多说, ...

  9. Java 中的 try catch 影响性能吗?

    前几天在 code review 时发现有一段代码中存在滥用try catch的现象.其实这种行为我们也许都经历过,刚参加工作想尽量避免出现崩溃问题,因此在很多地方都想着 try catch一下. 但 ...

  10. java 中的try catch在文件相关操作的使用

    import java.io.CharConversionException; import java.io.FileNotFoundException; import java.io.FileRea ...

随机推荐

  1. CAS3.5.2 Server登录后返回用户信息详细解决方案

    单点登录(Single Sign-On, 简称SSO)是目前比较流行的服务于企业业务整合的解决方案之一,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.大家在使用时CA ...

  2. vue2获取dom节点

    vue2.*版本中 在标签中加上ref='dom',然后在代码中this.$refs.dom这样就拿到了页面元素 例如:<div class='box' ref='myBox'>你好< ...

  3. nyoj 44-子串和(子串和最大问题)

    44-子串和 内存限制:64MB 时间限制:5000ms Special Judge: No accepted:12 submit:48 题目描述: 给定一整型数列{a1,a2...,an},找出连续 ...

  4. ArcGIS API For Javascript:新增热力图层的方法

    当我们要制作一个热力图层,可以通过以下 3 步来实现: 引入类 在 require 中需引入 "esri/layers/FeatureLayer", "esri/rend ...

  5. VLAN实验(1)Access接口

    1.选择两台S3700的交换机,5台PC机,并按照下图链接好并填写IP,完成此拓扑图 2.由于现在我们还没有划分VLAN,这5台PC,还在同一个VLAN中,现在我们启动所有的设备,这是所有的主机应该是 ...

  6. linux网络测试命令

    一.ping 它通过向目标主机发送一个个数据包以及接受数据包的回应来判断主机和目标主机之间网络连接情况.ping的两个功能:判断网络是否可达.网络性能统计. ping使用的是网络层的ICMP协议. p ...

  7. PHP是怎样重载的

    PHP 的重载跟 Java 的重载不同,不可混为一谈.Java 允许类中存在多个同名函数,每个函数的参数不相同,而 PHP 中只允许存在一个同名函数.例如,Java 的构造函数可以有多个,PHP 的构 ...

  8. 0MQ是会阻塞的,不要字面上看到队列就等同非阻塞。

    如果你是希望通过0MQ来做缓冲队列,非阻塞的效果,那你就必须清楚 0MQ Socket是会阻塞,你要搞清楚0MQ Socket与队列的关系. 官方协议文档规定了,一部分类型的 0MQ Socket为不 ...

  9. 0MQ文档导读

    1. 先结合RabbitMQ Tutorials,弄清0MQ socket的各种类型. 1.1. 0MQ PAIR 对应 RabbitMQ Tutorials的 "Hello world&q ...

  10. 同时发起TCP连接

    如果你的socket编程只限于创建SOCK_STREAM的socket,用connect-accept建立连接,然后就是recv,send.你就会惊奇tcp连接还可以不用accept. 上图为两个AF ...