首先我们要知道几个关于异常的关键字:
- try
- catch
- finally
- throw
- throws
Java虚拟机的方法调用栈
每个线程都有一个独立的方法调用栈,最新被调用的方法会被放到栈顶。那么发生异常时本方法有两种处理,一是捕获(try-catch)、二是throws。发生异常时Java虚拟机要找到能捕获该异常的catch,本方法找不到就弹出栈顶去下面的那个找,依次找下去,如果到调用栈的最底部的方法还没找到,就执行以下步骤:
- 调用异常对象的printStackTrace()方法,打印来自方法调用栈的异常信息。
- 如果不是主线程,那么终止这个线程;是主线程的话终止整个程序。
Java异常处理的注意事项
- 不能运用异常处理机制来控制程序的正常流程。
- 应该尽可能的在具备处理异常能力时及时处理异常而不是向下抛出异常。
异常流程的运行过程
1.finally语句不被执行的唯一情况是先执行了终止程序的System.exit(),程序终止之前会执行finally代码块。
public static void main(String[] args) throws Exception {
try {
System.out.println("Begin");
throw new Exception();
} catch (Exception e) {
System.out.println("Wrong");
throw e;
} finally {
System.out.println("Finally");
}
}
输出结果:
Begin
Wrong
Finally
Exception in thread "main" java.lang.Exception
at javabase.a.main(a.java:20)
本身main方法再throw异常就会终止程序的,但在此之前会执行finally代码块。
2.return用于退出本方法。在执行try或者catch代码块中的return语句时,如果存在finally代码块,会先执行finally代码块。
注:虽然在return之前会先执行finally代码块但是代码块里不能改变即将return的值。
3.最好不要在finally代码块中使用return语句,有两点原因:
- finally代码块里return会覆盖掉try和catch里的return。
- 如果在catch中需要再向下抛出异常,而finally里直接返回了,就会导致原本要抛出的异常丢失。
对你有帮助的话给点个赞呗(*/ω\*)