Java中finally代码块执行机制:为何运行时错误前先执行finally?
Java运行时异常与finally代码块执行顺序解析
当你输入错误内容(比如非数字字符串)时,触发的是Double.parseDouble抛出的NumberFormatException,这个异常并没有被你代码中的catch (MyException ex)块捕获,所以会按以下流程执行:
- try块执行到
Double.parseDouble(kb.nextLine())时抛出NumberFormatException,try块立即终止后续执行; - Java会优先执行
finally代码块——这是语言规范强制要求的,目的是保证收尾逻辑(比如资源释放、状态清理)一定会被执行,所以你会先看到foo:finally的输出; - finally块执行完成后,这个未被捕获的NumberFormatException才会被JVM向上抛出,最终打印出运行时错误信息。
补充两个和你代码相关的场景:
- 输入负数触发
MyException时,异常会被catch块捕获,先执行System.out.println("Cath:foo");,再执行finally块; - 输入0触发
YourException时,因为没有对应的catch块,同样会先执行finally块,再抛出运行时错误。
你的测试代码如下:
public class main { public static void main(String[] args) { try { Scanner kb = new Scanner(System.in); System.out.println("enter number:"); double val = Double.parseDouble(kb.nextLine()); double result = MathUtil.myLog(val); } catch (MyException ex) { System.out.println("Cath:foo"); } finally { System.out.println("foo:finally"); } } class MathUtil { public static double myLog(double val) { if (val < 0) throw new MyException(); if(val == 0) throw new YourException(); return Math.log(val); } class MyException extends RuntimeException { } class YourException extends RuntimeException { }
内容的提问来源于stack exchange,提问作者bigci1
相关产品推荐
相关产品推荐

