JAVA高级(2)—— 异常机制

一、基础

1、JAVA异常

1.1、Runtime异常

1)非Checked异常,所有RuntimeException及其子类的实例。
2)可以try...catch处理。

1.2、Checked异常

1)非Runtime异常的异常。
2)必须显示处理,否则编译不通过。

1.3、异常处理方式
  • try...catch处理
  • throws继续抛出

一旦某个catch捕获到匹配,进入异常处理代码,其他catch不再有机会捕获,因此捕获小异常应该在前,捕获大异常应该在后。

1.4、小结
  • 在当前方法被覆盖时,覆盖他的方法必须抛出相同的异常或异常的子类,不能抛出新异常
  • try 块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。一个catch捕获多个异常:catch(异常1 | 异常2)。
  • finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行,主要用于资源的回收,关闭。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行
  • 当try语句块里的某条语句出现异常时,而没有处理此异常的catch语句块时,此异常将会抛给JVM处理,finally语句块里的语句还是会被执行,但finally语句块后的语句不会被执行。
  • 在try语句块中,当执行到某一条语句出现异常时,程序将跳到catch语句块,并与catch语句块逐一匹配,其他的catch语句块将不会被执行,而try语句块中,出现异常之后的语句也不会被执行,catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句。
  • throw总是出现在函数体中,用来抛出一个Throwable类型的异常。程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块。如果抛出了检查异常,则还应该在方法头部声明方法可能抛出的异常类型。该方法的调用者也必须检查处理抛出的异常

在以下4种特殊情况下,finally块不会被执行
1)在finally语句块中发生了异常。
2)在前面的代码中用了System.exit()退出程序。
3)程序所在的线程死亡。
4)关闭CPU。

2、自定义异常

1、继承Exception(Checked异常)或者RuntimeException(Runtime异常)
2、有2个构造器,无参和入参是一个字符串,该字符串就是getMessage()返回的值

3、重要方法

getStackTrace()   StackTraceElement[]     //返回异常跟踪栈信息
printStackTrace()    //将异常跟踪栈信息输出到标准错误输出
printStackTrace(PrintStream s)     //将异常跟踪栈信息输出到指定的输出流

4、StackTraceElement

主要包含发生异常的文件名,类名,方法名,行数等信息
Thread.getStackTrace() StackTraceElement[] //此方法返回StackTraceElement数组,每个元素代表一个堆栈帧。
Thread.currentThread().getStackTrace()[0].getClassName()//得到当前线程的名字
new Exception().getStackTrace()[0] //得到的是当前类的名字
Thread.currentThread().getStackTrace()[1].getClassName() //得到的是当前类的名字
new Exception().getStackTrace()[1] //得到调用类的名字
Thread.currentThread().getStackTrace()[2].getClassName() //得到调用类的名字

用途
1)我们可以封装一个日志库,在打印目标日志的时候,也可以通过这个调用栈打印出这个日志所在的行数,
这样就可以迅速的定位到日志输出行。
2)如果我们写了一个SDK,希望某个方法在固定的位置被调用,我们也可以在这个方法被调用的时候,
进行检查,看这个方法的调用位置是否正确
3)我们在进行源码分析的时候,如果想分析整个代码的执行流程,我们可以进行通过打印栈的信息来获取,
这个在源码分析的时候还是挺有用的。

5、常见异常

RuntimeException子类
1)java.lang.ArrayIndexOutOfBoundsException
2)java.lang.ArithmeticException 算术条件异常。譬如:整数除零等。
3)java.lang.NullPointerException
4)java.lang.ClassNotFoundException

二、try catch finally的返回值问题

参考文献

深入理解java异常处理机制

你可能感兴趣的:(JAVA高级(2)—— 异常机制)