12

我有这个带有嵌套尝试的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 块有returnorcontinue语句。

什么时候doSomeThingVeryImportant()执行?当我得到一个Exception时,我得到一个NumberFormatException

我只希望在执行任何 catch 块之后,也执行 finally 块。

4

10 回答 10

21

如果使用 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 种可能的情况:

  1. try 块运行到最后,没有抛出异常。在这种情况下,finally 块将在 try 块之后执行。

  2. 在 try 块中引发异常,然后在其中一个 catch 块中捕获该异常。在这种情况下,finally 块将在 catch 块执行后立即执行。

  3. try 块中抛出了异常,并且方法中没有匹配的 catch 块可以捕获该异常。在这种情况下,对方法的调用结束,异常对象被抛出到封闭的方法——就像在 try-catch-finally 块所在的方法中一样。但是,在方法结束之前,finally 块被执行。

  4. 在 try 块运行完成之前,它会返回到调用该方法的位置。但是,在它返回调用方法之前,finally 块中的代码仍然被执行。所以,请记住,即使在 try 块中的某处有 return 语句,finally 块中的代码仍然会被执行。

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

于 2013-05-07T07:00:28.140 回答
6

The finally block always executes when the try block exits点击)。

于 2013-05-07T06:46:04.600 回答
2
The finally block always executes when the try block exits. 
This ensures that the finally block is executed even if an unexpected exception occurs

取自这里:http ://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

此外,该页面解释了may not如果在执行 try 或 catch 代码时 JVM 存在,或者执行 try/catch 的线程被中断或杀死,则执行 finally 块。

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

于 2013-05-07T06:46:25.710 回答
2

是的,Finally 总是执行。有例外和没有例外。

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

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

从 oracle 检查此链接:

http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

于 2013-05-07T06:46:34.820 回答
2

是的,finally块总是被执行的。

来源:http ://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html

于 2013-05-07T06:47:26.783 回答
2

是的; 或者,至少,尽可能接近“总是”。(所以,即使你有一个return或另一个throw。)

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

于 2013-05-07T06:49:02.873 回答
2

假设您的代码块是这样的:

 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 block无论如何都会被执行。

于 2013-05-07T06:52:23.537 回答
0

是的,最终总是被执行,这是因为人们可以编程以在出现异常或没有异常的情况下关闭/处理资源而不会失败。

http://docs.oracle.com/javase/tutorial/essential/exceptions/finally.html


更新以回答评论中的问题System.exit()

finally 块将不会执行,System.exit()除非它以 some 失败SecurityException


问题改变后更新。不管是什么异常,finally 块都会一直执行。

如果是,Exception那么您的 catch 块将不会执行,因为它仅捕获NumberFormatException

于 2013-05-07T06:46:24.750 回答
0

是的,finally 块总是被执行。 但适用条款和条件。

直到你调用System.exit();

于 2013-05-07T06:48:32.640 回答
0

不,finally 不会总是被执行。有两种情况最终不会被执行。

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

参考资料

对于您的问题,如果这两件事不存在,那么您的 finally 内部的任何内容都会被执行,这是肯定的。

于 2013-05-07T06:50:11.737 回答