【问题标题】:When finally is executed? [duplicate]finally 什么时候执行? [复制]
【发布时间】:2013-05-01 00:54:58
【问题描述】:

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

doSomeThingVeryImportant() 何时执行?当我收到NumberFormatException 时收到Exception 时?

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

【问题讨论】:

  • 出于好奇和扩展问题:即使在exit 语句之后最终执行?
  • 当您遇到异常时,您会运行您的代码并亲自查看它是否执行!我真的怀疑docs 中不存在的任何内容是否已发布在以下任何答案中!
  • 请停止投票。这不是一个重复的问题。

标签: java android try-catch


【解决方案1】:

The finally block always executes when the try block exits (click)。

【讨论】:

  • 我改了问题。
  • 并非总是如此。如果 System.exit() 调用,finally 不会被执行。
  • @tostao 我不能同意你的看法。你怎么看stackoverflow.com/questions/65035/…
  • 这是正确的 - 为什么它被否决了?在这种情况下,崩溃、故意退出等不算作异常,因为这个问题显然暗示了当代码/程序继续执行而不是当计算机崩溃、电源故障或用户故意退出时会发生什么——当然什么都不执行。
【解决方案2】:

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

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


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

finally 块不会在 System.exit() 的情况下执行,除非它以一些 SecurityException 失败。


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

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

【讨论】:

  • 我更新了问题:doSomeThingVeryImportant() 是否总是在我得到异常时执行?
  • 是的,在您的情况下 doSomeThingVeryImportant() 将始终执行。
  • 其实这不是真的。如果 JVM 被杀死或者 try/catch 在可能被中断或被杀死的线程中执行,finally 块可能不会被执行
  • 我改了问题。
【解决方案3】:
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

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

所以除非你可能会杀死 JVM 或者 try/catch 在线程中执行,否则 finally 块将始终被执行

【讨论】:

  • 我改了问题。
  • 即使出现异常并且在 catch 块中返回/中断/继续,也会运行 finally 块。唯一可能无法运行的情况是 JVM 死亡或执行 try/catch 的线程被杀死或中断。所以你的问题的答案是肯定的
【解决方案4】:

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

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

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

从 oracle 中查看此链接:

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

【讨论】:

  • 如果catch中有return语句怎么办?
  • 我改了问题。
  • @Marc finally 块即使在 catch 中有返回也会被执行
【解决方案5】:

是的,finally 块总是被执行。

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

【讨论】:

  • 是的,因为它在 finally 块中。
【解决方案6】:

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

直到你调用 System.exit();

【讨论】:

  • 我改了问题。
【解决方案7】:

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

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

【讨论】:

  • 我改了问题。
【解决方案8】:

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

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

java reference

对于你的问题,如果这两件事不存在,那么你的 finally 里面的任何东西都会被执行,那是肯定的。

【讨论】:

  • 我改了问题。
  • @VansFannel 不管你有没有异常,finally 都会被执行。如果有一个finally与try关联,无论是否发生异常,finally一定会被执行
【解决方案9】:

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

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

【讨论】:

  • 我已经改变了问题。
【解决方案10】:

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 块中抛出异常,即 然后被其中一个捕获块捕获。在这种情况下, finally 块将在 catch 块之后执行 执行。

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

  4. 在 try 块运行完成之前,它会返回到 方法被调用的地方。但是,在它返回之前 到调用方法,finally块中的代码还是 执行。所以,请记住 finally 块中的代码 即使有return也会执行 在 try 块中的某处声明。

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

【讨论】:

  • 我只希望在执行任何 catch 块之后,也执行 finally 块。
  • @VansFannel 是的,无论是否调用 catch,它都会执行
  • 抱歉,我不这么问。我问如果在内部带有 return 语句的 catch 块之后,执行 finally 方法还是不执行 return。里面有一个带有 continue 的 catch 块。我想知道在 continue 调用之后,finally 是否被执行。
  • 是的,那么它也将被调用,因为这是 finally 块的全部要点。查看我的更新
  • 这应该是正确答案
猜你喜欢
  • 2011-07-22
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
相关资源
最近更新 更多