什么时候执行?

时间:2013-05-07 06:44:26

标签: java android try-catch

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

doSomeThingVeryImportant()何时执行?当我获得Exception时<{1}}

我只想要在执行任何catch块之后,也执行finally块。

10 个答案:

答案 0 :(得分:19)

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块中抛出一个异常,就是这样 在方法中没有匹配的catch块可以捕获 例外。在这种情况下,调用方法 结束,并将异常对象抛出到封闭处 方法 - 就像try-catch-finally的方法一样 街区居住。但是,在方法结束之前,最后 阻止执行。

  4. 在try块运行完成之前,它返回到 无论何处调用该方法。但是,在它返回之前 对于调用方法,finally块中的代码仍然是 执行。所以,请记住finally块中的代码 即使有回报,也会被执行 在try块的某个地方发表声明。

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

答案 1 :(得分:2)

The finally block always executes when the try block exitsclick)。

答案 2 :(得分: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

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

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

答案 3 :(得分:2)

是的,最后总是执行。除了例外,没有例外。

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

例如,用于处理对象,关闭打开的服务器连接和那种东西。

从oracle检查此链接:

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

答案 4 :(得分:2)

是的,finally块总是被执行。

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

答案 5 :(得分:2)

是;或者,至少尽可能接近“永远”。 (所以,即使您有return或其他throw。)

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

答案 6 :(得分: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无论如何都会被执行。

答案 7 :(得分:0)

是的,最后总是被执行,因为如果出现异常或没有异常,可以编程关闭/处理资源

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


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

的评论中的问题

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


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

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

答案 8 :(得分:0)

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

除非您致电 System.exit();

,否则直到此为止

答案 9 :(得分:0)

不,终于不会总是执行。有两种情况,最终将无法执行。

  

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

java reference

对于你的问题,如果这两件事情都不存在,那么无论你的内心是什么,都会被执行,这是肯定的。