为什么方法在抛出异常后不需要返回值?

互联网 行业动态 更新时间:2024-06-13 00:19:07

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) 语句也会导致异常。异常会导致控制转移,这可能会阻止语句的正常完成。

所以:要求是方法不能正常完成;两者returnthrow都是导致方法异常完成的方式。


请注意,这并不是说该方法必须异常完成:返回到开头的 while 循环示例,这不会正常或异常完成:因为循环条件是常量 true,并且不包含 return , throw 或 break 或可能引发异常的语句,该循环永远不会完成,这也很好(至少从语言角度来看)。

更多推荐

不需要,抛出,返回值,异常,方法

本文发布于:2023-04-20 20:54:54,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/hyzx/0ce31c34337d22be57ffa837ea64b9e4.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:不需要   抛出   返回值   异常   方法

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!