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

2024-01-23

有谁知道为什么:

public void foo()
{
    System.out.println("Hello");
    return;
    System.out.println("World!");
}

在Eclipse下会报“无法到达的错误”,但是

public void foo()
{
    System.out.println("Hello");
    if(true) return;
    System.out.println("World!");
}

只触发“死代码”警告?

我能想到的唯一解释是 Java 编译器仅标记第一个,并且 Eclipse 中的一些额外分析可以找出第二个。但是,如果是这样的话,为什么Java编译器不能在编译时弄清楚这种情况呢?

Java 编译器是否不会在编译时发现 if(true) 无效,从而生成本质上相同的字节码?在什么时候应用可达代码分析?

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


第一个是not编译(您收到错误),第二个编译(您刚刚收到警告)。这就是区别。

至于为什么 Eclipse 会检测死代码,嗯,这只是带有内置编译器的集成开发工具的便利性,与 JDK 相比,它可以进行更多微调来检测此类代码。

Update:JDK 实际上消除了死代码。

public class Test {
    public void foo() {
        System.out.println("foo");
        if(true)return;
        System.out.println("foo");
    }
    public void bar() {
        System.out.println("bar");
        if(false)return;
        System.out.println("bar");
    }
}

javap -c says:



public class Test extends java.lang.Object{
public Test();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."":()V
   4:   return

public void foo();
  Code:
   0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc             #3; //String foo
   5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/StrV
   8:   return

public void bar();
  Code:
   0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   3:   ldc             #5; //String bar
   5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   8:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
   11:  ldc             #5; //String bar
   13:  invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   16:  return

}
  

至于为什么它(Sun)没有给出警告,我不知道:)至少 JDK 编译器实际上内置了 DCE(死代码消除)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Eclipse 下 Java 中无法访问的代码错误与死代码警告? 的相关文章

随机推荐

  • 如何在 Visual Studio 中最好地处理巨大的源代码文件

    我正在开发一个大量使用代码生成的项目 它生成的一些文件包含超过 25 万行代码 VS 2K5 处理得还不错 但 R 4 01 每隔两分钟左右就会抛出一个内存不足异常 将它们拆分为部分类 单独的文件并不是短期内的选择 尽管可能会稍后 有什么聪
  • 观察到包 ID 'build-tools;20.0.0' 位置不一致

    gradlew parallel app assembleDebugTest 当我运行上面的命令时安卓工作室终端我收到此错误 Error并行执行是一个正在孵化的功能 在不一致的位置 sdk build tools android 4 4W
  • STL 中的比较器

    我正在使用 struct minHeap 使用priority queue生成最小堆 并且函数comp使用STL中给出的排序函数以相反的顺序打印数字 现在我的疑问是我不能在函数 sort 中使用 struct minHeap 也不能在pri
  • 使用背景图像自定义 UIBarbuttonitem

    我添加了一个 UIToolbar 实例和其顶部的按钮 每个按钮都属于 UIBarButtonItem 类 我的要求是每个按钮都有一个自定义的布局 我不想使用苹果提供的原生按钮样式 所以我在 Interface Builder 中有 3 个选
  • PIP 安装请求运行时错误:Python 2.7 中超出最大递归深度

    我是 Python 新手 面临以下问题 当我尝试使用命令安装 请求 模块时PIP install request 我收到错误 RuntimeError maximum recursion depth exceeded Command pyt
  • System.Drawing 可以在 Azure 网站中使用吗?

    我有一个网站 计划从一家老式网络托管公司迁移到 Microsoft Azure 它是一个 ASP NET 应用程序 使用 System Drawing 来呈现一些图形 我读过一些有关 Azure 网站不支持 GDI 的内容 这是否意味着 S
  • Angular ui-grid 双击行打开弹出窗口以编辑行

    VERSION 我正在使用 Angular ui grid 版本 3 0 0 RC 18 http ui grid info http ui grid info PROBLEM 我想在 ui grid 表中实现双击事件 特别是 我想在双击一
  • 是否可以始终使用“mov eax, 0x1”代替“mov rax, 0x1”?

    当组装这段代码时nasm BITS 64 mov eax 0x1 mov rax 0x1 我得到这个输出 b8 01 00 00 00 b8 01 00 00 00 这是操作码mov eax 0x1重复两次 这是否意味着mov rax 0x
  • 计算布尔值数组中真实成员的数量

    刚接触 javascript 我在计算布尔值数组中 true 的数量时遇到了麻烦 我正在尝试使用reduce 函数 有人可以告诉我我做错了什么吗 trying to count the number of true in an array
  • Android 画布绘制文本不工作

    我使用canvas的drawText方法制作了一个自定义视图 不知何故 任何 Jelly Bean 设备上都没有显示任何文本 它适用于 ICS 及以下版本 有谁知道此方法或任何相关方法从 API 15 到 16 是否发生了任何变化 编辑代码
  • JPA:不重写实体中的 equals() 和 hashCode() 吗?

    看完之后本文 http community jboss org wiki EqualsandHashCode 我倾向于不完全覆盖 equals 和 hashCode 在那篇文章的摘要中 关于根本没有 eq hC 列 唯一的结果是我无法执行如
  • __PRETTY_FUNCTION__、__FUNCTION__、__func__ 之间有什么区别?

    有什么区别 PRETTY FUNCTION FUNCTION func 它们记录在哪里 我如何决定使用哪一个 func 是一个隐式声明的标识符 当在函数内部使用时 它会扩展为包含函数名称的字符数组变量 它在 C99 中被添加到 C 中 从C
  • Android中如何设置按钮的背景图片?

    我在drawable mdpi中导入了一张图像 然后从按钮实现了该图像 但出现错误no resource found here 我该如何解决这个问题 我试过这个 main xml
  • Sencha Touch 动画选项

    在哪里可以找到 Ext Panel show 的可用动画类型列表 我搜索了文档并用谷歌搜索了 sencha touchanimation options 但找不到任何东西 你可以在这里看到所有的动画 http dev sencha com
  • 如何在 C++ 中增加“z”之外的字母组合?

    我正在处理 Excel 电子表格 并且必须仅使用一种类型的公式来处理大量数据 由于在公式中唯一必要的更改涉及字母 我想知道是否有一种方法可以制作一个程序 按照 Excel 列顺序 A B C Z AA AB AC AZ BA BB BC B
  • Asp.Net URL 的绝对路径

    为了使 Web 应用程序能够更轻松地与不同服务器上的另一个应用程序共享文件 我在母版页中使用了基本 href 标签 正如许多人发现的那样 这破坏了 Web 表单路径 我有一个工作表单适配器类 但不确定如何获取 url 的绝对路径 目前 我的
  • Apache 配置:Websockets 代理 WSS 请求到 WS 后端

    预先感谢您的任何帮助 我尝试使用 Apache 作为使用 WSS 的 Web 浏览器和后端 WS 服务器进程之间的代理 浏览器 Apache RabbitMQ Stomp 我在 Apache 中正确设置了 HTTPS 并通过 443 提供页
  • 如何使用 python 的 BaseHTTPServer / SimpleHTTPServer 调试 POST 请求?

    我找到了一个脚本这个网站 http wiki python org moin BaseHttpServer用于使用 python 通过命令行运行一个简单的服务器 我添加了一些print行 因为我想通过命令行打印请求的 GET 和 POST
  • addEventListener 在 IE8 中不起作用

    我动态创建了一个复选框 我用过addEventListener单击复选框即可调用函数 该函数适用于 Google Chrome 和 Firefox 但在 Internet Explorer 8 中不起作用 这是我的代码 var checkb
  • Eclipse 下 Java 中无法访问的代码错误与死代码警告?

    有谁知道为什么 public void foo System out println Hello return System out println World 在Eclipse下会报 无法到达的错误 但是 public void foo