相关疑难解决方法(0)

Eclipse中Java中无法访问代码错误与死代码警告?

有谁知道原因:

public void foo()
{
    System.out.println("Hello");
    return;
    System.out.println("World!");
}
Run Code Online (Sandbox Code Playgroud)

将被报告为Eclipse下的"无法访问的错误",但是

public void foo()
{
    System.out.println("Hello");
    if(true) return;
    System.out.println("World!");
}
Run Code Online (Sandbox Code Playgroud)

只触发"死代码"警告?

我能想到的唯一解释是Java编译器只标记第一个,而Eclipse中的一些额外分析计算出第二个.但是,如果是这种情况,为什么Java编译器不能在编译时弄清楚这种情况呢?

Java编译器不会在编译时弄清楚if(true)没有效果,从而产生基本相同的字节码吗?在什么时候应用可达代码分析?

我想一个更通用的方法来思考这个问题是:"什么时候应用可达代码分析"?在将第二个Java代码片段转换为最终字节码时,我确信在某些时候删除了"if(true)"运行时等效项,并且两个程序的表示变得相同.然后,Java编译器不会再次应用其可访问的代码分析吗?

java eclipse dead-code unreachable-code

53
推荐指数
3
解决办法
3万
查看次数

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

以下代码给出了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万
查看次数