相关疑难解决方法(0)

无法访问的代码编译器错误

以下代码给出了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到字节码进行任何类型的优化(或者即使它没有)那么为什么它不会在第二个例子中检测到明显无法访问的代码呢?编译器伪代码用于检查语句是否无法访问?

java compiler-construction

25
推荐指数
2
解决办法
2万
查看次数

无法访问的代码:错误或警告?

这是一个语言设计问题:

您是否认为无法访问的代码(通常是编程语言)应该发出警告(即"报告问题并反正编译")或错误("拒绝编译")?

就个人而言,我强烈认为这应该是一个错误:如果程序员编写了一段代码,那么它应该始终是为了在某些情况下实际运行它.但是,例如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)

language-agnostic compiler-construction language-design

21
推荐指数
5
解决办法
2万
查看次数

无法访问的声明:如果为true则为true

我该如何理解这个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 returnif true return.

java javac unreachable-code

9
推荐指数
2
解决办法
1035
查看次数

Java中无法访问的语句编译错误

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行永远不会执行.但我仍然不明白为什么抛出编译时错误.我收到"无法访问的语句"编译错误.

这是否意味着编译器检查它是否能够编译所有分支/代码行?

java unreachable-code

8
推荐指数
2
解决办法
6万
查看次数

Java中无法访问的语句

我在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

java unreachable-statement bluej

1
推荐指数
1
解决办法
4740
查看次数