我有一个方法,通过重载这样一个整数baz
作为可选参数...
public static void myMethod(String fooBar, Integer baz) {
switch(baz){} // baz gets unboxed, NPE if it was null
if(baz != null) {
// Do something
}
else {
// Do something else
}
}
public static void myMethod(String fooBar) {
myMethod(fooBar, null);
}
然而,它给了我一个关于else
声明说它已死密码的警告。但是,如果在没有baz
的情况下调用该方法,baz
应该默认为null
,因此这不应该是死代码。关于我在这里做错了什么的任何解释?即使我在重载方法中将baz
设置为null
,{{1}}如何始终为非空?
编辑:删除了实际代码,以便我的问题更容易阅读。
答案 0 :(得分:4)
您在switch
变量上使用Integer
。
如果Integer
为null
,则切换会抛出NullPointerException
,但您无法捕获。
因此,程序流不可能达到else
条件。
Integer
语句中使用 switch
,则取消装箱。您必须在null
语句之前明确检查switch
。另请参阅How to use null in switch。
P.S。重现问题的最小代码是:
public static void myMethod(String fooBar, Integer baz) {
switch(baz){} // baz gets unboxed, NPE if it was null
if(baz != null) {
// Do something
}
else {
// Do something else
}
}
答案 1 :(得分:1)
Eclipse告诉您else
语句是死代码的唯一方法是在baz
语句之前为if
分配一个新的整数,因此无法成为null
。
但是因为你只展示了代码的一部分,所以很难说。
修改强>
如果NullPointerException
为空,则switch语句将抛出tlsVersionMax
。这就是为什么你的声明是死代码。