Integer i = ...
switch (i) {
case null:
doSomething0();
break;
}
在上面的代码中,我不能在switch case语句中使用null。我该怎么做呢?我不能用默认,因为我想做别的。
Integer i = ...
switch (i) {
case null:
doSomething0();
break;
}
在上面的代码中,我不能在switch case语句中使用null。我该怎么做呢?我不能用默认,因为我想做别的。
当前回答
想想SWITCH是如何工作的,
对于原语,我们知道NPE自动装箱可能会失败 但对于String或enum,它可能会调用equals方法,这显然需要一个LHS值来调用equals。 因此,如果没有方法可以在null上调用,switch不能处理null。
其他回答
我今天才知道,你不必放另一层缩进/花括号,只是因为if检查为空。你可以做以下任何一种:
if (i == null) {
// ...
} else switch (i) {
case 1:
// ...
break;
default:
// ...
}
or
if (i != null) switch (i) {
case 1:
// ...
break;
default:
// ...
} else {
// ...
}
基于@tetsuo的答案,java 8:
Integer i = ...
switch (Optional.ofNullable(i).orElse(DEFAULT_VALUE)) {
case DEFAULT_VALUE:
doDefault();
break;
}
你必须做出一个
if (i == null) {
doSomething0();
} else {
switch (i) {
}
}
switch(i)如果i为null,将抛出NullPointerException,因为它将尝试将Integer拆箱为int。所以case null,恰好是非法的,永远不会被达到。
你需要在switch语句之前检查i是否为空。
一些库尝试提供内置java switch语句的替代方案。Vavr就是其中之一,他们把它推广到模式匹配。
以下是他们文档中的一个例子:
String s = Match(i).of(
Case($(1), "one"),
Case($(2), "two"),
Case($(), "?")
);
您可以使用任何谓词,但它们提供了许多开箱即用的谓词,$(null)是完全合法的。我发现这是一个比替代方案更优雅的解决方案,但这需要java8和对vavr库的依赖…