Java 尝试捕捉最终返回澄清
通过阅读本论坛中与上述主题相关的所有问题(见标题),我完全理解,Java 尝试捕捉最终返回澄清,java,return,try-catch,finally,Java,Return,Try Catch,Finally,通过阅读本论坛中与上述主题相关的所有问题(见标题),我完全理解,最终总是被呼叫。(从系统退出和无限循环除外)。但是,我想知道是否在catch块中调用了一个return,然后从finally块调用了另一个return 例如: public static void main(String[]args) { int a = new TestClass().absorbeTheValue(); } int absorbeTheValue() { try { int a
最终
总是被呼叫。(从系统退出和无限循环除外)。但是,我想知道是否在catch块中调用了一个return
,然后从finally块调用了另一个return
例如:
public static void main(String[]args) {
int a = new TestClass().absorbeTheValue();
}
int absorbeTheValue() {
try {
int a = 10/0;
if (a > 0) return 4;
} catch(Exception e) {
return 45;
} finally {
return 34;
}
}
所以这里的输出(当调用方法时)在任何情况下都是34。这意味着最后总是会跑掉。我认为其他的“回报”根本没有运行。在许多帖子中,我发现了这样一个事实,即最终将内容写在catch子句return已经编写的内容之上。我的理解是,只要catch子句中的返回值即将被计算,控制流就会传递给finally子句,finally子句又有另一个返回,这次将对返回进行计算,而不会将控制权传递回catch子句。这样,在运行时调用的唯一return
将是finally return。你同意吗
finally
中的return
不会将控件传回程序,而是返回值并终止该方法。我们可以这么说吗?如果到达try
块中的返回
,它将控制权转移到finally
块,函数最终正常返回(不是抛出)
如果出现异常,但随后代码从catch
块到达return
,控制权将转移到finally
块,函数最终正常返回(不是抛出)
在您的示例中,在finally
中有一个return
,因此无论发生什么,函数都将返回34
,因为finally
具有finally(如果愿意)单词
尽管您的示例中没有介绍,但即使您没有捕获
并且try
块中抛出异常且未捕获,这也是正确的。通过从finally
块执行返回
,可以完全抑制异常。考虑:
public class FinallyReturn {
public static final void main(String[] args) {
System.out.println(foo(args));
}
private static int foo(String[] args) {
try {
int n = Integer.parseInt(args[0]);
return n;
}
finally {
return 42;
}
}
}
如果在不提供任何参数的情况下运行:
$ java FinallyReturn
$java FinallyReturn
…在foo
中的代码抛出ArrayIndexOutOfBoundsException
。但是,由于finally
块执行返回
,因此该异常被抑制
这就是为什么最好避免在finally
中使用return
的原因之一。下面是一些代码,展示了它的工作原理
class Test
{
public static void main(String args[])
{
System.out.println(Test.test());
}
public static String test()
{
try {
System.out.println("try");
throw new Exception();
} catch(Exception e) {
System.out.println("catch");
return "return";
} finally {
System.out.println("finally");
return "return in finally";
}
}
}
结果是:
try
catch
finally
return in finally
请缩进您的代码。另请参见:您的问题是什么?+1简单易懂,并教会了我一些新的东西:)@LoganDam T.J.Crowder给出了一个非常好的解释。@LoganDam:这是一个很好的操作顺序的清晰解释。然而,它没有回答所提出的问题。该问题明确询问当finally
块包含return
语句时会发生什么。@unholycsampler good catch,我更新了答案。谢谢。我又学到了一些新东西。。。坚持下去,伙计们!需要注意的是,出于这些目的,throw
可以与return
互换。(例如,抛出新异常(4)
,抛出新异常(34)
)我只想插嘴一下user1442960所说的话。JLS并没有提到在一次捕获或最终捕获中的返回。它使用术语“突然”,我猜这意味着异常或返回。@Steve11235:不,来自catch
块的return
将“正常地”完成,而不是“突然地”。这一点从以下几点可以很清楚地看出:在抛出异常的过程中,Java虚拟机会一个接一个地突然完成在当前线程中已开始执行但尚未完成的任何表达式、语句、方法和构造函数调用、初始值设定项以及字段初始化表达式