问题1:
为什么以下代码在没有return语句的情况下编译?
public int a() {
while(true);
}
Run Code Online (Sandbox Code Playgroud)
注意:如果我在一段时间后添加返回,那么我得到一个Unreachable Code Error.
问题2:
另一方面,为什么以下代码编译,
public int a() {
while(0 == 0);
}
Run Code Online (Sandbox Code Playgroud)
即使以下没有.
public int a(int b) {
while(b == b);
}
Run Code Online (Sandbox Code Playgroud) 我想知道为什么Java中允许以下代码,而不会出现编译错误?在我看来,此代码通过不返回任何内容来中断方法签名String.有人可以解释我在这里缺少的东西吗?
public class Loop {
private String withoutReturnStatement() {
while(true) {}
}
public static void main(String[] a) {
new Loop().withoutReturnStatement();
}
}
Run Code Online (Sandbox Code Playgroud) 给出以下代码示例:
public class WeirdStuff {
public static int doSomething() {
while(true);
}
public static void main(String[] args) {
doSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个有效的Java程序,虽然方法doSomething()应该返回一个int但从来没有.如果你运行它,它将以无限循环结束.如果将while循环的参数放在一个单独的变量中(例如boolean bool = true),编译器会告诉你在这个方法中返回一个int.
所以我的问题是:这是Java规范中的某个地方,是否存在这种行为可能有用的情况?
答:这个主题的最佳答案基本上回答了我的问题:在非void方法中缺少return语句编译.
我想知道为什么我不需要在这个private方法中返回一个值?
public class Test {
private String testLoop() {
while(true) { }
}
public static void main(String[] args) {
Test test = new Test();
test.testLoop();
}
}
Run Code Online (Sandbox Code Playgroud)
我觉得这不应该编译.但是,它编译得很好.这被定义为合法的?
在这种情况下,我发现将方法更改为:
private String testLoop() {
while(true) {
if(false == true) {
break;
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
要求我提供一个返回类型,即使javap告诉我编译器为两个实现生成完全相同的字节代码testLoop.
那么Java编译器如何以及何时确定方法是否实际需要返回值?
不幸的是,删除的答案提到了暂停问题.我想Java编译器并没有像上面给出的例子那样努力跟踪方法,因为它无法在常规设置中找到所有可能的循环.