kay*_*ya3 8
抛出异常会中断控制流,立即退出方法。当抛出异常时,不需要返回值,因为调用该方法的代码没有正常完成。例如,在下面的代码中,不需要foo
返回数字,因为int x = foo();
没有成功,而是传播异常:
int foo() {
throw new RuntimeException();
}
void bar() {
int x = foo();
// This line will not be reached
System.out.println(x);
}
由于后面的代码int x = foo();
无论如何都不会执行,因此不需要x
从 接收返回值foo
,因此foo
不需要提供返回值。
事实上,一个方法不能既返回值又抛出异常,因为返回值意味着该方法正常完成。
And*_*ner 5
返回值的方法实际上并没有要求包含 return 语句。也许令人惊讶的是,这段代码是合法的:
int noReturn() {
while (true) {}
}
语言规范的关键是JLS 8.4.7,它说:
如果将方法声明为具有返回类型(第 8.4.5 节),则如果方法的主体可以正常完成(第 14.1 节),则会发生编译时错误。
JLS 14.1中描述了“正常完成” :
每个语句都有一个正常的执行模式,其中执行某些计算步骤。以下部分描述了每种语句的正常执行模式。
如果所有步骤都按描述执行,没有任何突然完成的迹象,则称该语句正常完成。但是,某些事件可能会阻止语句正常完成:
break、yield、continue 和 return 语句(第 14.15 节、第 14.21 节、第 14.16 节、第 14.17 节)会导致控制权转移,这可能会阻止包含它们的表达式、语句和块的正常完成。 某些表达式的求值可能会从 Java 虚拟机(第 15.6 节)中引发异常。显式 throw (§14.18) 语句也会导致异常。异常会导致控制转移,这可能会阻止语句的正常完成。
所以:要求是方法不能正常完成;两者return
和throw
都是导致方法异常完成的方式。
请注意,这并不是说该方法必须异常完成:返回到开头的 while 循环示例,这不会正常或异常完成:因为循环条件是常量 true,并且不包含 return , throw 或 break 或可能引发异常的语句,该循环永远不会完成,这也很好(至少从语言角度来看)。
更多推荐
不需要,抛出,返回值,异常,方法
发布评论