以下代码给出了unreachable statement编译器错误
public static void main(String[] args) {
return;
System.out.println("unreachable");
}
Run Code Online (Sandbox Code Playgroud)
有时为了测试目的,希望阻止调用方法,因此快速执行此操作(而不是在使用它的任何地方对其进行注释)是立即从方法返回,以便该方法不执行任何操作.然后我总是这样做以解决编译器错误
public static void main(String[] args) {
if (true) {
return;
}
System.out.println("unreachable");
}
Run Code Online (Sandbox Code Playgroud)
我只是好奇,为什么它是一个编译错误?它会以某种方式打破Java字节码,它是为了保护程序员还是其他东西?
另外(这对我来说更有趣),如果编译java到字节码进行任何类型的优化(或者即使它没有)那么为什么它不会在第二个例子中检测到明显无法访问的代码呢?编译器伪代码用于检查语句是否无法访问?
这是一个语言设计问题:
您是否认为无法访问的代码(通常是编程语言)应该发出警告(即"报告问题并反正编译")或错误("拒绝编译")?
就个人而言,我强烈认为这应该是一个错误:如果程序员编写了一段代码,那么它应该始终是为了在某些情况下实际运行它.但是,例如C#编译器似乎不同意这一点,只是报告了一个警告.
注意:我意识到良好的死代码检测是一个非常困难的问题,但这不是这个问题的焦点.
以下是一些代码片段的示例,其中一些语句明显无法访问:
return;
foo();
Run Code Online (Sandbox Code Playgroud)
-
throw new Exception();
foo();
Run Code Online (Sandbox Code Playgroud)
-
if (...) {
return;
} else {
throw new Exception();
}
foo();
Run Code Online (Sandbox Code Playgroud) 我该如何理解这个Java编译器的行为?
while (true) return;
System.out.println("I love Java");
// Err: unreachable statement
if (true) return;
System.out.println("I hate Java");
// OK.
Run Code Online (Sandbox Code Playgroud)
谢谢.
编辑:
几分钟后我发现了这一点:
在第一种情况下,编译器因无限循环而抛出错误.在这两种情况下,编译器都不会考虑语句内部的代码.
编辑二:
让我对javac印象深刻的是:
if (true) return; // Correct
}
while (true) return; // Correct
}
Run Code Online (Sandbox Code Playgroud)
看起来javac知道两个循环内部是什么,如果结果,但是当你编写另一个命令时(如第一个例子中),你得到非等效行为(看起来像javac忘记了循环内部/ if).
公共静态最终EDIT III:
作为此答案我可以此话(希望正确)的结果:作为表达if (arg) { ...; return;}和while (arg) { ...; return;}对Java是等效的两个语义和语法(在字节码)当且仅当argv是不恒定的(或有效最终型)的表达.如果argv是常量表达式字节码(和行为)可能不同.
免责声明
这个问题不是关于无法访问的语句,而是对逻辑等效表达式的不同处理,例如while true return和if true return.
class For1
{
public static void main(String args[])
{
int a = 0;
for(;;)
{
break;
System.out.println(a); //Line 1
++a;//Line 2
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道第1行/第2行永远不会执行.但我仍然不明白为什么抛出编译时错误.我收到"无法访问的语句"编译错误.
这是否意味着编译器检查它是否能够编译所有分支/代码行?
我在BlueJ工作,为我的大学课程,我已经设置了一个基本的任务,我们需要用户输入有关DVD的某些信息,如导演,姓名,运行时间等.
我在Java编码,也使用Genio.以下代码是我在变量中获取和设置信息的方式;
public void getDVDInfo() {
//Ask for info
System.out.println("Please Enter the Film Info:");
System.out.println("Film Name: ");
System.out.println("Film Director: ");
System.out.println("Lead Actor/Actress: ");
System.out.println("Running Time: ");
}
public void setDVDInfo() {
//set user input to variables
filmName = Genio.getString();
director = Genio.getString();
leadActor = Genio.getString();
runTime = Genio.getInteger();
}
Run Code Online (Sandbox Code Playgroud)
这一切都根据我在BlueJ中使用的编译器工作,但是当我编写函数以将信息返回给用户时,就像这样;
public String seeDVDInfo() {
return filmName;
return director;
return leadActor;
}
public int seeRunTime() {
return runTime;
}
Run Code Online (Sandbox Code Playgroud)
它提出了一个编译器错误,return director;那是一个无法访问的语句.我不明白这是从哪里来的,一切看起来都合适,任何人都可以帮助我吗?
在此先感谢xx