Try-Catch-Finally的次序问题

    技术2023-06-25  66

    常见的Try-Catch-Finally的执行次序: 如下面这片代码

    InputStream in = new FileInputStream(. . .); try { // 1 code that might throw exceptions // 2 } catch (IOException e) { // 3 show error message // 4 } finally { // 5 in.close(); } // 6

    如果出现异常,则会按着1-2-3-4-5-6执行

    如果没有异常或是捕获的异常类型不对,便会按着1-2-5-6进行执行

    如果finally之前发生过异常并且在catch语句中被处理完且没有抛出新的异常,那么finally之后的语句会正常执行。

    如果在catch或者finally中又产生了新的异常且没有被处理,那么finally之后的语句就不会执行了。


    那么对于一些特殊的情况呢?

    比如在try{}语句中直接return了,常规理解是return后变直接跳出方法,但是我们实际编程去看

    public static void main(String[] args) { System.out.println(test()); } public static int test() { try { return 0; } finally { System.out.println("finally."); } }

    这个会输出什么?

    finally. 0

    可以看出return先执行,但是并没有真正的退出函数,而是先把值存储起来, 执行完finally之后再取出来作为返回值,所以说何如果try或者catch中存在return语句,finally中的语句还是会执行


    catch或者finally中又产生了新的异常且没有被处理,那么finally之后的语句就不会执行

    不过如果在try()中添加异常,是不可能跳过finally的

    如果我们非得不运行finally

    在下面try{}中…包含什么代码的时候,程序才不会打印出finally?

    try { ... } catch(Exception e) { System.out.println("catch"); } finally { System.out.println("finally"); }

    答案:

    System.exit(0);

    如果不允许抛出新的异常的话,可以看到只有程序退出才能避免走到finally,否则无论出现什么样的情况都要执行finally

    Processed: 0.010, SQL: 9