Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中带有finally子句的try/catch块返回_Java_Return_Try Catch_Try Catch Finally - Fatal编程技术网

java中带有finally子句的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 我怀疑这种行为与线程有关,但我不确定。请开导我。谢谢。最后在返回语句

给定java中的以下try/catch块:

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。我很困惑