Java异常

Throwable
通常会在每个项目中建立属于每个服务的自定义服务异常,或者整个项目的自定义异常,在出现问题时能够更加快速准确的确定错误位置。


Throwable常用的方法:

  1. toString() 返回的是用于描述该异常情况的类的完整类名。
  2. getMessage() 返回创建Throwable对象的时候传入的消息字符串的,
  3. printStackTrace() 打印异常的栈信息。

Java异常层次结构图

throwable.jpg

Error:错误一般都是由于jvm或者是硬件引发的问题,所有一般都不会通过代码去处理。

Exception: 异常 如果程序出现了异常,那么一般就需要通过代码去处理了。

  • 运行时异常 (RunTimeException以及RuntimeException子类 )如果一个方法内部抛出了一个运行时异常对象,那么方法声明可以声明抛出也可以不声明抛出,如果调用了一个声明抛出运行时异常类型的方法,那么调用者可以处理也可以不处理。

  • 编译时异常(非运行时异常,受检异常)如果一个方法内部抛出了一个编异常译时异常对象,那么该方法则必须要声明抛出,如果调用了一个声明抛出编译时异常类型的方法,那么调用者必须要处理.

异常的栈信息如何出现

异常的栈信息是通过printStackTrace的方法打印的,java虚拟机在执行a/b代码的时候,发现b(除数)等于0在现实生活中是属于一种不正常的情况,jvm一旦发现了不正常的情况,那么就会马上创建一个相应的异常对象,并且调用该异常对象的printStackTrace方法把异常的信息打印处理。

异常的方式处理:

1. try-catch块捕获

1
2
3
4
5
try{
可能会发生异常的代码
}catch(异常类型 变量名){
处理异常的代码
}

捕获处理要注意的细节:

  1. 如果一个try块中出现了异常代码经过处理之后,那么try-catch块外面的代码可以正常的执行。
  2. 如果一个try块中出现了异常的代码,那么在一个try块中出现异常代码后面的代码无法正常执行。
  3. 一个try块后面可以跟有多个catch块,也就是说一个块可以捕获多种异常的类型。
  4. 一个try块后面可以跟有多个catch块,但是捕获的异常类型必须按照从小到大进行捕获。

2.抛出:

抛出处理. (throw 、 throws)
抛出处理要注意的细节:

  1. 如果一个方法的内部抛出了一个编译时异常对象,那么必须 要在方法声明抛出。
  2. 如果调用了一个声明抛出编译时异常类型的方法,那么调用者必须要进行处理,否则编译报错。
  3. 一个方法如果遇到了throw关键字,那么该方法会马上停止执行。
  4. 在一个种情况下只能抛出一种异常对象。

throw 与 throws的区别:

  1. throw关键字是用于在一个方法的内部抛出异常对象的,throws是用于在方法上声明抛出异常类型的。
  2. throw关键字后面跟的是一个异常的对象,throws后面跟的是异常的类型。
  3. throw关键字一次只能抛出一个异常对象,throws一次可以声明抛出多种异常类型。

finally块

finally块的使用前提: 必须要配合try块使用,不能单独使用。
finally块的代码在任何情况下都可以执行,只有在jvm退出的情况才不会执行。

try块的表现形式就有三种:

  1. 适用于没有资源文件释放,只需要处理异常的代码使用。

    1
    2
    3
    4
    5
    try{ 
    可能发生异常的代码
    } catch( 异常类的类型 e){
    异常的处理代码
    }
  2. 适用于既有资源释放也需要处理异常的代码去使用。

    1
    2
    3
    4
    5
    6
    7
    try{ 
    可能发生异常的代码
    } catch( 异常类的类型 e){
    异常的处理代码
    } finally{
    释放资源的代码;
    }
  3. 只需要 释放资源文件,不需要处理异常的代码去使用

    1
    2
    3
    4
    5
    try{ 
    可能发生异常的代码
    } finally{
    释放资源的代码;
    }

finally块不被执行情况

  1. 在finally语句块第一行发生了异常。 因为在其他行,finally块还是会得到执行
  2. 在前面的代码中用了System.exit(int)已退出程序。 exit是带参函数 ;若该语句在异常语句之后,finally会执行
  3. 程序所在的线程死亡。
  4. 关闭CPU。

返回值

如果try语句里有return,返回的是try语句块中变量值。
详细执行过程如下:

  1. 如果有返回值,就把返回值保存到局部变量中;
  2. 执行jsr指令跳到finally语句里执行;
  3. 执行完finally语句后,返回之前保存在局部变量表里的值。
  4. 如果try,finally语句里均有return,忽略try的return,而使用finally的return.

finally不执行情况 和 try/catch返回值 引用

------------- 感谢阅读-------------