当前位置: 首页 > 知识库问答 >
问题:

具有return类型的Java方法编译时不使用return语句

黄浩涆
2023-03-14

问题1:

为什么下面的代码在没有return语句的情况下进行编译?

public int a() {
    while(true);
}

注意:如果在while之后添加return,则会得到unreachable Code error

问题2:

另一方面,为什么下面的代码会编译,

public int a() {
    while(0 == 0);
}

即使下面的不是。

public int a(int b) {
    while(b == b);
}

共有1个答案

蓟辰沛
2023-03-14

问题1:

为什么下面的代码在没有return语句的情况下进行编译?

public int a() 
{
    while(true);
}

《联合劳工法典》第8.4.7节对此作了规定:

如果一个方法被声明为具有返回类型(§8.4.5),那么如果该方法的主体能够正常完成(§14.1)则会发生编译时错误。

换句话说,具有返回类型的方法必须仅通过使用提供值返回的return语句返回;方法不允许“落其身端”。关于方法体中的return语句的精确规则,请参见§14.17。

方法有可能具有返回类型,但不包含返回语句。这里有一个例子:

class DizzyDean {
    int pitch() { throw new RuntimeException("90 mph?!"); }
}

由于编译器知道循环永远不会终止(true当然总是true),它知道函数不能“正常返回”(去掉其主体的末尾),因此没有return就可以了。

问题2:

另一方面,为什么下面的代码会编译,

public int a() 
{
    while(0 == 0);
}

即使下面的不是。

public int a(int b)
{
    while(b == b);
}

0==0情况下,编译器知道循环永远不会终止(0==0将始终为true)。但它不知道对于b==b

为什么不呢?

编译器理解常数表达式(§15.28)。引用第15.2节-表达形式(因为奇怪的是,这句话不在第15.28节中):

有些表达式有一个值,可以在编译时确定。这些是常数表达式(§15.28)。

b==b示例中,由于涉及一个变量,因此它不是一个常量表达式,也不指定在编译时确定。我们可以看到,在这种情况下,它总是正确的(尽管如QBrute所指出的,如果bdouble,我们很容易被double.nan所愚弄,它本身不是==),但是JLS只指定常量表达式是在编译时确定的,它不允许编译器尝试计算非常量表达式。Bayou.io为为什么不这样做提出了一个很好的观点:如果您开始尝试在编译时确定包含变量的表达式,那么您会在哪里停止呢?b==b是显而易见的(呃,对于非nan值),但是a+b==b+a呢?还是(a+b)*2==a*2+b*2?用常量划线是有意义的。

因此,由于它不“确定”表达式,编译器不知道循环永远不会终止,所以它认为方法可以正常返回 ;--这是不允许的,因为它需要使用return。因此它抱怨缺少return

 类似资料:
  • 我在试着测试我正在学习的一门课。我想运行一个打印报表,以员工的月薪乘以12,给我年薪,然后加10%。除了最后一部分,我已经把所有的工作都做好了 线程“main”Java.util.unknownformatconversionexception:Conversion='r'在Java.util.formatter$formatspecier.Conversion(formatter.Java:26

  • 我遇到一种情况,一个non-void方法缺少一个return语句,而代码仍然在编译。我知道while循环之后的语句是不可达的(死代码),并且永远不会被执行。但是为什么编译器甚至不警告返回一些东西呢?或者为什么一种语言允许我们有一个非void的方法,它有一个无限循环,而不返回任何东西? 如果我在while循环中添加一个break语句(即使是一个条件语句),编译器就会抱怨那些臭名昭著的错误:在Ecli

  • 为什么我不能在不使用return语句的情况下运行此代码段?

  • return 关键字并不是专门用于结束循环的,return 语句用于终止函数的执行或退出类的方法,并把控制权返回该方法的调用者。如果这个方法带有返回类型,return 语句就必须返回这个类型的值;如果这个方法没有返回值,可以使用没有表达式的 return 语句。 return 语句的一般语法格式如下: 如果一个方法使用了 return 语句并且后面跟有该方法返回类型的值,那么调用此方法后,所得到的

  • 此ProductDAO类返回用户的产品列表,但Netbeans中的编译器显示“Missing return statement”。有进展吗?

  • 我开始写一个二叉树函数。该方法目前的目标是在树中找到节点并返回节点。根值是数据,左边和右边是子树。当我在调试器中单步执行它时,当它到达return语句时,它会跳回第二个if块,并最终返回null。