在try或catch块上调用return语句或System.exit

时间:2014-08-17 05:40:12

标签: java

我在采访中提到了以下问题:

  

如果在try上调用return语句或System.exit会发生什么   还是阻挡?最后会阻止执行吗?

finally块总是被执行吗?

修改 在java中尝试以上内容后:

    如果我在try块或catch块中放入return语句,则
  1. finally块执行但是

  2. 如果我调用System.exit表单try或catch,
  3. finally块不会运行。

  4. 我不知道背后的原因。

3 个答案:

答案 0 :(得分:7)

  

如果在try上调用return语句或System.exit会发生什么   还是阻挡?

     

最终会阻止执行吗?

如果是return,是的。如果您需要血腥细节,请在JLS section 14.20.2中指定。

(请注意,在JLS术语中,return计为突然终止。但这并不重要,因为当您仔细分析规范时,您会看到正常突然终止都会执行finally。)

对于System.exit(),否。对exit方法的调用永远不会返回,也不会抛出异常。因此,线程的“封闭”finally子句永远不会被执行。

(在JLS的说法中,exit()调用根本没有“终止”。它在概念上与进入无限循环的方法相同(神奇地)不使用任何CPU时间。与JVM关闭相关的活动发生在其他线程上。)

答案 1 :(得分:3)

根据the tutorials from Oracle

  

注意:如果在执行try或catch代码时JVM退出,那么       finally块可能无法执行。同样,如果线程执行try       或者catch代码被中断或终止,finally块可能无法执行       即使整个申请仍在继续。

这句话似乎意味着:

  • 如果finally被调用,System.exit(0)将不会执行(,因为当调用该语句时Java VM退出
  • 在调用return语句时执行(,因为在调用该语句时Java VM不会退出)。

你可以用我写的一些代码来证实这一点:

public class TryExample {
    public static void main(String[] args)
    {
        try {
            int[] i = {1, 2, 3};
            int x = i[3];//Change to 2 to see "return" result
            return;
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("caught");
            System.exit(0);
        } finally {
            System.out.println("finally");
        }
    }
}

此处,在return块中调用try时,"最后"仍然输出到终端,但是在System.exit(0)块中调用catch时,它不是。

答案 2 :(得分:2)

不,它不会,当try-catch没有正常完成时,最后阻止不会被执行。

这是JLS或者它并声明:

If execution of the try block completes normally, then the finally block is executed

catch block

相同
 If the catch block completes normally, then the finally block is executed.

由于您正在调用System.exit来终止try block内的程序,因此try-catch未正常完成,因此finally block将不会被执行。

对于return statement,try-catch确实正常完成,因为你没有阻塞try block(例如无限循环,休眠线程,终止程序等)因此{{1}从方法返回后执行。