当前位置: 首页 > 面试题库 >

Eclipse错误?仅在默认情况下打开null

齐航
2023-03-14
问题内容

enum正在进行实验,发现以下代码可以在Eclipse上编译并正常运行(版本ID:20090920-1017,不确定确切的编译器版本):

public class SwitchingOnAnull {
    enum X { ,; }
    public static void main(String[] args) {
        X x = null;
        switch(x) {
            default: System.out.println("Hello world!");
        }
    }
}

在Eclipse中编译并运行时,此命令"Hello world!"会正常打印并退出。

对于javac编译器,这NullPointerException将按预期方式抛出。

那么Eclipse Java编译器中有bug吗?


问题答案:

这是一个错误。这是switch根据 Java语言规范,第三版 的声明的指定行为:

[JLS 14.11

switch声明](http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.11)

SwitchStatement:
    switch ( Expression ) SwitchBlock

switch执行该语句时,首先对Expression进行评估。如果结果ExpressionnullNullPointerException则抛出a
,并且由于switch这个原因,整个语句突然完成。

显然,Eclipse中的错误与default大小写无关enum

html" target="_blank">public class SwitchingOnAnull {
    public static void main(String[] args) {        
        java.math.RoundingMode x = null;
        switch(x) {};

        switch((Integer) null) {};

        switch((Character) null) {
            default: System.out.println("I've got sunshine!");
        }       
    }
}

上面的代码在Eclipse(至少是某些版本)上编译并运行“精细”。使用编译时,每个人都会switch抛出一个,这完全符合规范的要求。NullPointerException``javac

原因

这是javap -c SwitchingOnAnull在Eclipse下编译时的:

Compiled from "SwitchingOnAnull.java"
public class SwitchingOnAnull extends java.lang.Object{
public SwitchingOnAnull();
Code:
 0: aload_0
 1: invokespecial  #8; //Method java/lang/Object."<init>":()V
 4: return

public static void main(java.lang.String[]);
Code:
 0: aconst_null
 1: astore_1
 2: getstatic     #16; //Field java/lang/System.out:Ljava/io/PrintStream;
 5: ldc           #22; //String I've got sunshine!
 7: invokevirtual #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
10: return

}

看来Eclipse编译器switch完全摆脱了整个构造。不幸的是,这种优化违反了语言规范。

官方话

该错误已归档并已分配修复。

奥利维尔·托曼(Olivier Thomann)2010-05-28 08:37:21

我们在优化上过于激进。

对于:

  switch((Integer) null) {};

我们switch至少应该评估表达式时才能优化整个语句。

我会看一看。

3.6.1的候选人。

也可以看看

  • 错误314830-打开null表达式并不总是抛出NullPointerException


 类似资料:
  • 我想从缺省的图库中选择文件,如图像,视频,但当我使用下面的函数打开图库时,它也给了我一些不必要的选项来选择文件,如“文件管理器,文件管理器”。这些应用程序安装在我的电话上,我不想要那些应用程序时,我打开和选择媒体文件。 plz帮助

  • 在Hybris Backoffice中,当选择任何类型节点(例如产品、客户等)时,默认情况下简单搜索是可见的。然后用户需要点击图标打开高级搜索。有很多例子可以禁用简单搜索,只显示高级搜索小部件。然而,我需要的是交换简单和高级搜索的可见状态,即: 支持简单搜索和高级搜索 默认情况下,高级搜索可见 单击按钮,高级搜索将折叠,简单搜索可见 敬请指点。

  • 问题内容: 我正在制作一个嵌套菜单和子菜单,到目前为止,所有操作都已完成。.现在,我需要使此可折叠菜单默认根据给定的ID打开。 您还可以查看下面的完整工作代码段, 需求: 我有一个ID值存储在父组件中(您可以在数组变量下面查看此变量)。 即使有多个子菜单,此ID也将仅属于上一级子ID,因此肯定会有一个复选框,以便需要选中此复选框,并且需要打开父级菜单。 例如.., 正如openMenuId一样,因

  • 是否可以默认打开所有信息窗口。我尝试了以下方法,但不起作用:

  • 我使用此链接在Windows设置中的git bash中启用conda 但是,每当我从上下文菜单打开git bash时,它都不会默认激活base环境。每当我在Windows中打开bash终端时,如何让它默认激活base?

  • 这里,当url模式为“/login/new”时,不调用servlet,我通过打印到Console来验证这一点。它只适用于默认情况,即“/login” 期望的输出是应该调用“/new”大小写中的函数。我遗漏了什么?