关于java:什么时候执行?

When finally is executed?

本问题已经有最佳答案,请猛点这里访问。

我有这个嵌套尝试的Java代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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时,当我得到一个NumberFormatException时?

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


最后,使用的块,如果块是放置后,尝试catch块,和跟随它。在最后那块包含的代码将运行是否异常是一thrown try块中。对于一般的语法看起来像这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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块中运行到结束,是与异常thrown。在这个场景中,并将该块执行后的试块。

  • 一个例外是thrown try块中,这是一然后在一个catch块捕获的。在这个场景中,最后,将该块后的CATCH块运行的权利executes。

  • 一个例外是在try块thrown没在匹配的catch块可以捕捉的方法该异常。在这个场景中,该呼叫的方法异常结束,和对象是在封闭thrown在方法,该方法中的try - catch -最后块的所在。但是,在最后结束的方法。块被执行。

  • 在try块运行到完成它的回报无论是被的方法。但是,在它的回报在invoking方法,仍然是在最后的代码块执行。所以,记住,在最后的代码块他们可以执行即使有回报在try块中的语句。

  • 最后更新:永远不执行,所发生的物在try catch块(或回车,完成异常,故障,等)。


    你是说这样的事情:这个代码块

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     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");
        }

    如果你运行这个,然后你将得到的是输出。

    1
    2
    3
    4
    first try block
    second try block...
    end of loop
    finally block

    操作系统finally block无论如何得到执行。


    是的,或者,至少,在尽可能接近"永远"。(如果你的操作系统,即使有一个或另一个throwreturn)。

    如果你是你杀的过程或程序,在得到的死锁或无限循环中,或你的设备是由流星了,那么将没有finallyREACH的程序流块。


    是的,是finally块总是执行。

    来源:http://///docs.oracle.com javaSE /例外/ finally.html精华教程


    是的,最后executes永远。在与异常的异常。

    它的某些部分是肯定的方式获得永远的执行代码。

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

    检查这个链接来自:Oracle

    http:/ / / / / docs.oracle.com javaSE /例外/ finally.html精华教程


    1
    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

    从这里采取的docs.oracle.com:http://////补习javase的基本异常/ finally.html

    此外,该页面是最后may notexplains块被执行,如果存在或JVM尝试捕获码而被执行的线程,或者如果被杀的是interrupted try / catch或。

    所以,除非你可以杀死或捕获的Java虚拟机在执行try / beeing线程一块,最后将永远被执行


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


    最后,在得到执行,永远不会。有两个问题,最后才得到执行。

    Note: If the JVM exits while the try or catch code is being executed, then the finally block may not execute. Likewise, if the thread executing the try or catch code is interrupted or killed, the finally block may not execute even though the application as a whole continues.

    java参考

    你的问题是,如果这些人是不是也有两个,在你最后将得到执行,这是肯定的。


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

    除非除非你呼叫system.exit();


    是的,因为总是有最后一个CAN和其执行关闭处理程序资源异常或异常的情况下,没有失败。

    http:/ / / / / docs.oracle.com javaSE /例外/ finally.html精华教程

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

    在最后的块将无法运行,除非它失败的情况下SecurityExceptionSystem.exit()消失。

    更新后的变化的问题。什么是最后的物质的异常块将永远运行。

    如果它,然后你将不ExceptionCATCH块运行到它的NumberFormatExceptionOnly