Java 最后什么时候执行?

Java 最后什么时候执行?,java,android,try-catch,Java,Android,Try Catch,我有一个嵌套try的java代码: try { try { [ ... ] { catch (Exception ex) { showLogMessage(ex); return; } while (condition == true) { try { [ ... ] { catch (Ex

我有一个嵌套try的java代码:

try
{   
    try
    {
        [ ... ]
    {
    catch (Exception ex)
    {
        showLogMessage(ex);
        return;
    }

    while (condition == true)
    {
        try
        {
            [ ... ]
        {
        catch (Exception ex)
        {
            showLogMessage(ex);
            continue;
        }

        [ ... ]
    }
}
catch (NumberFormatException e)
{
    showLogMessage(e);
}
finally
{
    doSomeThingVeryImportant();
}
我想知道当我遇到异常时,是否总是执行
finally
。我这样问是因为catch块有
return
continue
语句

何时执行
doSomeThingVeryImportant()
?当我收到
异常时,当我收到
NumberFormatException时,
打开时?


我只想知道在执行任何catch块之后,finally块是否也会执行。

当try块退出时,finally块始终会执行。

是的,最后总是会执行,因为在出现异常或无异常时,可以编程关闭/处理资源


更新以回答有关
System.exit()

如果出现
System.exit()
,则finally块将不会执行,除非它因某些
安全异常而失败


问题更改后更新。无论异常是什么,最终块将始终执行

如果它的
异常
则不会执行catch块,因为它只捕获
NumberFormatException

The finally block always executes when the try block exits. 
This ensures that the finally block is executed even if an unexpected exception occurs
摘自这里:

此外,该页面还说明,如果在执行try或catch代码时存在JVM,或者如果执行try/catch的线程被中断或终止,则可能不会执行finally块


因此,除非您可以杀死JVM或在线程中执行try/catch,否则finally块将始终执行

是的,finally始终执行。无一例外

这是确保部分代码始终执行的方法

例如,用于处理对象、关闭打开的服务器连接等

从oracle检查此链接:


是的,
最后始终执行


来源:

是的,最后总是执行块。但条款和条件适用


直到调用System.exit()是;或者,至少,尽可能接近“始终”。(因此,即使您有一个
返回
或另一个
抛出


如果您的进程被终止,或者您的程序陷入死锁或无限循环,或者您的设备被流星击中,那么程序流将不会到达
finally
块。

不,finally不会始终执行。有两种情况下,Finally无法执行

注意:如果JVM在执行try或catch代码时退出,那么finally块可能不会执行。同样,如果执行try或catch代码的线程被中断或终止,那么即使整个应用程序继续运行,finally块也可能不会执行


对于您的问题,如果没有这两件事,那么您的代码块中的任何内容都将被执行,这是肯定的。

假设您的代码块如下所示:

 try
    {   
        try
        {
            System.out.println("first try block");
        }
        catch (Exception ex)
        {
            System.out.println("first cathc block");
            return;
        }

        while (true)
        {
            try
            {
               System.out.println("second try block...");
            }
            catch (Exception ex)
            {
                System.out.println("second catch block");
                continue;
            }

            System.out.println("end of loop");
            break;
        }
    }
    catch (NumberFormatException e)
    {
        System.out.println("last catch block");
    }
    finally
    {
        System.out.println("finally block");
    }
如果运行此操作,则将获得的输出为:

first try block
second try block...
end of loop
finally block

因此,
finally块
仍然会执行。

如果使用finally块,则将其放置在try块及其后面的catch块之后。finally块包含无论try块中是否抛出异常都将运行的代码。一般语法如下所示:

public void someMethod{
   Try {
   // some code
   }

   Catch(Exception x) {
   // some code
   }

   Catch(ExceptionClass y) {
   // some code
   }

   Finally{
   //this code will be executed whether or not an exception 
   //is thrown or caught
   }
}
这里有4种可能的情况:

  • try块一直运行到最后,没有异常 扔。在此场景中,最后一个块将是 在try块之后执行

  • 在try块中引发异常,该异常为 然后被一个挡块卡住了。在这种情况下, finally块将在catch块之后执行 执行

  • 在try块中抛出一个异常,并且 无法捕获的方法中没有匹配的catch块 例外。在这个场景中,对方法的调用 结束,异常对象被抛出到封闭对象 方法-如try-catch-finally所使用的方法 街区居住。但是,在方法结束之前,最终 块被执行

  • 在try块运行完成之前,它将返回到 无论在何处调用该方法。但是在它回来之前 对于调用方法,finally块中的代码仍然是 执行。所以,记住finally块中的代码 即使有回报,仍将被执行 语句位于try块的某个位置



  • 更新:无论try或catch块(失败、返回、异常、完成等)中发生了什么,最终都会被执行。

    出于好奇和问题的扩展:即使在
    exit
    语句之后是否最终执行?如果执行与否,您应该运行代码并亲自查看,当你得到一个例外!我真的怀疑,如果有什么是不存在的,已经张贴在下面的任何答案!请停止投票。这不是一个重复的问题。我已经更新了这个问题:当我遇到异常时,doSomeThingVeryImportant()是否总是执行?是的,在您的情况下,doSomeThingVeryImportant()将总是执行。实际上这不是真的。如果JVM被终止,或者try/catch在一个线程中被执行,而这个线程可能被中断或终止,那么finally块可能不会被执行。我已经改变了这个问题。它不会总是这样。如果System.exit()调用,最终将不会执行。@tostao我不能同意你的看法。你认为这是对的,为什么被否决?崩溃、故意退出等。在这种情况下不算例外,因为问题显然意味着当代码/程序继续执行时会发生什么,而不是当计算机崩溃时,出现电源故障或用户故意退出-确保不执行任何操作。如果catch中有return语句怎么办?我已更改了问题。@Marc Finally block将在eve执行