Integer i = ...
switch (i) {
case null:
doSomething0();
break;
}
在上面的代码中,我不能在 switch case 语句中使用 null。我怎样才能做到这一点?我不能使用default
,因为那时我想做其他事情。
Integer i = ...
switch (i) {
case null:
doSomething0();
break;
}
在上面的代码中,我不能在 switch case 语句中使用 null。我怎样才能做到这一点?我不能使用default
,因为那时我想做其他事情。
switch
这对于 Java 中的语句是不可能的。null
之前检查switch
:
if (i == null) {
doSomething0();
} else {
switch (i) {
case 1:
// ...
break;
}
}
您不能在switch
语句*中使用任意对象。编译器不抱怨switch (i)
where i
is anInteger
的原因是 Java 自动拆箱Integer
到int
. 正如 assylias 已经说过的,拆箱会抛出NullPointerException
when i
is null
。
*从 Java 7 开始,您可以使用String
inswitch
语句。
Oracle Docs - Switch中有关switch
(包括带有空变量的示例)的更多信息
switch ((i != null) ? i : DEFAULT_VALUE) {
//...
}
switch(i)
如果 i 是null
,将抛出 NullPointerException ,因为它会尝试将其拆箱Integer
为int
. 所以case null
,这恰好是非法的,无论如何都不会达到。
switch
您需要在语句之前检查 i 是否为空。
Java docs clearly stated that:
The prohibition against using null as a switch label prevents one from writing code that can never be executed. If the switch expression is of a reference type, such as a boxed primitive type or an enum, a run-time error will occur if the expression evaluates to null at run-time.
You must have to verify for null before Swithch statement execution.
if (i == null)
case null: // will never be executed, therefore disallowed.
鉴于:
public enum PersonType {
COOL_GUY(1),
JERK(2);
private final int typeId;
private PersonType(int typeId) {
this.typeId = typeId;
}
public final int getTypeId() {
return typeId;
}
public static PersonType findByTypeId(int typeId) {
for (PersonType type : values()) {
if (type.typeId == typeId) {
return type;
}
}
return null;
}
}
对我来说,这通常与数据库中的查找表一致(仅适用于很少更新的表)。
但是,当我尝试findByTypeId
在 switch 语句中使用时(很可能来自用户输入)......
int userInput = 3;
PersonType personType = PersonType.findByTypeId(userInput);
switch(personType) {
case COOL_GUY:
// Do things only a cool guy would do.
break;
case JERK:
// Push back. Don't enable him.
break;
default:
// I don't know or care what to do with this mess.
}
...正如其他人所说,这会导致 NPE @ switch(personType) {
。我开始实施的一种解决方法(即“解决方案”)是添加一个UNKNOWN(-1)
类型。
public enum PersonType {
UNKNOWN(-1),
COOL_GUY(1),
JERK(2);
...
public static PersonType findByTypeId(int id) {
...
return UNKNOWN;
}
}
现在,您不必在重要的地方进行空值检查,您可以选择或不处理UNKNOWN
类型。(注意:-1
在业务场景中不太可能是标识符,但显然选择对您的用例有意义的东西)。
你必须做一个
if (i == null) {
doSomething0();
} else {
switch (i) {
}
}
你也可以使用String.valueOf((Object) nullableString)
喜欢
switch (String.valueOf((Object) nullableString)) {
case "someCase"
//...
break;
...
case "null": // or default:
//...
break;
}
查看有趣的 SO Q/A:为什么 String.valueOf(null) 会抛出 NullPointerException
基于@tetsuo 的回答,使用 java 8 :
Integer i = ...
switch (Optional.ofNullable(i).orElse(DEFAULT_VALUE)) {
case DEFAULT_VALUE:
doDefault();
break;
}
switch (String.valueOf(value)){
case "null":
default:
}
你不能。您可以在 switch 中使用原语(int、char、short、byte)和字符串(仅限 java 7 中的字符串)。原语不能为空。切换前
检查单独的条件。i
我今天刚刚了解到,您不必仅仅因为 if 正在检查 null 就添加另一层缩进/大括号。您可以执行以下任一操作:
if (i == null) {
// ...
} else switch (i) {
case 1:
// ...
break;
default:
// ...
}
或者
if (i != null) switch (i) {
case 1:
// ...
break;
default:
// ...
} else {
// ...
}
只需考虑 SWITCH 的工作方式,