最终何时执行?

2022-09-04 05:56:03

我有这个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();
}

我想知道当我遇到异常时是否总是执行。我问这个是因为捕获块有或语句。finallyreturncontinue

doSomeThingVeryImportant() 何时执行?当我收到一个号码格式异常时,我得到了一个例外

我只希望在执行任何捕获块之后,最终块也会执行。


答案 1

如果使用,最终块将放在 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 块运行到最后,并且不会引发任何异常。在这种情况下,最终块将在 try 块之后执行。

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

  3. 在 try 块中引发异常,并且在可以捕获异常的方法中没有匹配的 catch 块。在此方案中,对该方法的调用结束,异常对象被抛出到封闭方法中 - 就像 try-catch-final 块所在的方法中一样。但是,在方法结束之前,将执行最终的块。

  4. 在 try 块运行完成之前,它将返回到调用方法的任何位置。但是,在它返回到调用方法之前,最终块中的代码仍会执行。因此,请记住,即使 try 块中的某个位置有 return 语句,最终块中的代码仍将执行。

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


答案 2

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


推荐