代码之家  ›  专栏  ›  技术社区  ›  jax

即使抛出新的异常,finally块也会运行吗?

  •  124
  • jax  · 技术社区  · 15 年前

    在这个代码中 someVar 即使执行catch块并引发第二个异常,也要设置它?

    public void someFunction() throws Exception {
        try {
            //CODE HERE
        } catch (Exception e) {
            Log.e(TAG, "", e);
            throw new Exception(e);
        } finally {
            this.someVar= true;
        }
    }
    
    6 回复  |  直到 7 年前
        1
  •  158
  •   Audrius MeÅ¡kauskas    9 年前

    是的,最后一个街区总是在…除非:

    • 运行try catch finally块的线程被终止或中断
    • 你使用 System.exit(0);
    • 底层虚拟机以其他方式销毁
    • 底层硬件在某种程度上不可用

    此外,如果finally块中的方法抛出未捕获的异常,则在该异常之后将不执行任何操作(即,将像在任何其他代码中那样抛出异常)。一个很常见的情况是 java.sql.Connection.close()

    顺便说一句,我猜想您使用的代码示例只是一个示例,但是要小心将实际逻辑放入finally块中。最后一个块用于资源清理(关闭数据库连接、释放文件句柄等),而不是用于必须运行的逻辑。如果它必须在try-catch块之前运行,远离可能引发异常的内容,因为您的意图在功能上几乎是相同的。

        2
  •  9
  •   froadie    15 年前

    对。

    查看 documentation :

    最后一块 总是 执行时间 Try块退出。

    例外情况:

    注意:如果在尝试时JVM退出 或者正在执行catch代码,然后 finally块可能无法执行。 同样,如果执行 尝试或捕获代码被中断或 杀了,最后一个街区可能不会 即使应用程序是 一个整体在继续。

        3
  •  1
  •   urmalp    15 年前

    The finally block always executes when the try block exits 。除非您有System.exit(0)in your try or catch。

        4
  •  1
  •   Vladimir Ivanov    15 年前

    对。 finally 块总是执行,除非您调用Stury.Ext.(),因为它阻止Java VM。

        5
  •  0
  •   Yogesh Kumar    10 年前

    不管你的情况如何,最终都会被执行。

    • 尝试捕获finally块
    • 投掷

    对于未检查的异常,Java不强制、错误处理。 这就是原因,如果finally块中发生未选中的异常,并且没有对此进行任何处理,则不会执行在此点下方写入的代码(发生错误的地方)。

    所以我建议总是处理所有的例外情况,不管是检查还是取消检查。 这样,无论是否也发生未选中的异常,您都可以确保finally中的代码块也被执行。你有一个地方在次窝捕捉,最后阻止你的必要工作完成。

        6
  •  0
  •   Vasanth Umapathy    7 年前

    最后,总是执行块。

    public class ExceptionTest {
    
    public static void someFunction(String input) throws Exception {
        try {
            if( input.equals("ABC") ) {
                System.out.println("Matched");
            }
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
            System.out.println("Input Is "+input+" Finally Executed!!!");
        }
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            System.out.println("********* Test with VALUE ********* ");
            someFunction("ABC");
            System.out.println("\r\n********* Test with NULL  ********* ");
            someFunction(null);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    

    }

    Java Try Catch Finally Block with Throw