如果try-block突然完成怎么办?

时间:2014-10-25 11:32:04

标签: java exception

JLS 11中说:

  

在抛出异常的过程中, Java虚拟机   一个接一个地突然完成,任何表达式,语句,方法   和构造函数调用,初始值设定项和字段初始化   已开始但尚未在当前执行的表达式   线程。

假设我有以下代码:

public static void m(){
    throw new SQLException();
}

public static void d(){
    m();
}

public static void main(String[] args){
    d();
}

如果由于投掷m()而导致SQLException突然完成。 JLS并没有明确表示Java虚拟机突然完成了任何表达式,语句,方法等,出于同样的原因。这可能意味着d()因抛出SQLException而出于不同的原因而完成。你能澄清那一刻吗?

2 个答案:

答案 0 :(得分:2)

它没有在那里定义,但它在Chapter 14,它谈到了一般的突然完成:

  

如果语句评估表达式,则突然完成   表达总是导致立即突然完成   声明,出于同样的原因。正常的所有后续步骤   不执行执行模式。

     

除非本章另有规定,否则突然完成   子语句导致语句的立即突然完成   本身,出于同样的原因,以及正常的所有后续步骤   不执行该语句的执行方式。

因此,我们可以得出结论,它没有被指定用于例外,因为它突然完成的所有可能原因都是正确的,而不仅仅是例外。

答案 1 :(得分:2)

  

JLS并没有说明Java虚拟机因为同样的原因而逐个完成任何表达式,语句,方法等

第11节没有这样说,但是在规范的其他部分讨论了终止原因;例如JLS 14.1JLS 15.6

正如@biziclop所指出的那样,14.1中的文本明确指出终止原因不会随着异常传播而改变。 (但是,当处理异常时,它们可以改变......)

但这对你来说不应该是新闻。它与Java教程和教科书中说Java异常行为的方式一致。