我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语言规范,第三版 的声明的指定行为:
switch
声明](http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.11)
SwitchStatement: switch ( Expression ) SwitchBlock
switch
执行该语句时,首先对Expression
进行评估。如果结果Expression
为null
,NullPointerException
则抛出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的候选人。
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”大小写中的函数。我遗漏了什么?