java中带有finally子句的try/catch块返回
给定java中的以下try/catch块:java中带有finally子句的try/catch块返回,java,return,try-catch,try-catch-finally,Java,Return,Try Catch,Try Catch Finally,给定java中的以下try/catch块: try{ return; } catch(SomeException e){ System.out.println(e); } finally{ System.out.println("This is the finally block"); } 根据这篇文章:“我可以看到程序的输出将是‘这是最后一个块’。但是,我不知道怎么可能,因为print语句前面有一个return 我怀疑这种行为与线程有关,但我不确定。请开导我。谢谢。最后在返回语句
try{
return;
}
catch(SomeException e){
System.out.println(e);
}
finally{
System.out.println("This is the finally block");
}
根据这篇文章:“我可以看到程序的输出将是‘这是最后一个块’。但是,我不知道怎么可能,因为print语句前面有一个return
我怀疑这种行为与线程有关,但我不确定。请开导我。谢谢。
最后在返回
语句之前执行
。按照java规则,除了JVM崩溃或调用System.exit()
时,将始终执行finally
Java语言规范明确提到在不同条件下执行finally:
最后在返回
语句之前执行
。按照java规则,除了JVM崩溃或调用System.exit()
时,将始终执行finally
Java语言规范明确提到在不同条件下执行finally:
return
语句对finally
块的执行没有影响。不执行finally
块的唯一方法是在执行finally
块之前,如果JVM
崩溃/退出。查看此以了解更多信息。因此,如果您的代码被替换为
try{
System.exit(0);
}
catch(SomeException e){
System.out.println(e);
}
finally{
System.out.println("This is the finally block");
}
finally
块不会执行return
语句对finally
块的执行没有影响。不执行finally
块的唯一方法是在执行finally
块之前,如果JVM
崩溃/退出。查看此以了解更多信息。因此,如果您的代码被替换为
try{
System.exit(0);
}
catch(SomeException e){
System.out.println(e);
}
finally{
System.out.println("This is the finally block");
}
最终
块将不会执行Juned是正确的。我还想提醒大家不要从finally块抛出异常,它们会引发其他发生的异常。例如(有点傻的例子,但它说明了问题):
在这种情况下,即使捕获并重新抛出SQLException,最终也会在此处抛出RuntimeException,它将“屏蔽”或覆盖SQLException。调用者将收到RuntimeException,而不是SQLException。Juned是正确的。我还想提醒大家不要从finally块抛出异常,它们会引发其他发生的异常。例如(有点傻的例子,但它说明了问题):
在这种情况下,即使捕获并重新抛出SQLException,最终也会在此处抛出RuntimeException,它将“屏蔽”或覆盖SQLException。调用者将收到RuntimeException,而不是SQLException。该问题的第三个答案详细解释了它。该问题的第三个答案详细解释了它。文档声明如果在方法或构造函数中有任何try语句,其try块包含return语句,那么这些try语句的任何finally子句都将按照从最内层到最外层的顺序执行,然后再将控制权转移给方法或构造函数的调用方“。如果我将try块中的代码更改为
返回0代码>然后我的控制台将打印“这是最终块”,然后打印0。但是,如果我在之前放置一个print语句,则返回0代码>然后顺序是-新try的block print语句“This is the finally block”,然后是0。我感到困惑的是,文档中说“如果在方法或构造函数中有任何try语句,其try块包含return语句,那么这些try语句的任何finally子句都将按照从最内层到最外层的顺序执行,然后将控制权转移给方法或构造函数的调用方”。如果我将try块中的代码更改为返回0代码>然后我的控制台将打印“这是最终块”,然后打印0。但是,如果我在之前放置一个print语句,则返回0代码>然后顺序是-新try的block print语句“This is the finally block”,然后是0。我很困惑