Integer i = ...
    
switch (i) {
    case null:
        doSomething0();
        break;    
}

在上面的代码中,我不能在switch case语句中使用null。我该怎么做呢?我不能用默认,因为我想做别的。


当前回答

基于@tetsuo的答案,java 8:

Integer i = ...

switch (Optional.ofNullable(i).orElse(DEFAULT_VALUE)) {
    case DEFAULT_VALUE:
        doDefault();
        break;    
}

其他回答

想想SWITCH是如何工作的,

对于原语,我们知道NPE自动装箱可能会失败 但对于String或enum,它可能会调用equals方法,这显然需要一个LHS值来调用equals。 因此,如果没有方法可以在null上调用,switch不能处理null。

你不能。你可以在switch中使用基本类型(int, char, short, byte)和String(仅在java 7中使用字符串)。原语不能为空。 开关前检查i是否处于单独状态。

switch(i)如果i为null,将抛出NullPointerException,因为它将尝试将Integer拆箱为int。所以case null,恰好是非法的,永远不会被达到。

你需要在switch语句之前检查i是否为空。

你必须做出一个

if (i == null) {
   doSomething0();
} else {
   switch (i) {
   }
}

你也可以使用String.valueOf((对象)nullableString) 就像

switch (String.valueOf((Object) nullableString)) {
case "someCase"
    //...
    break;
...
case "null": // or default:
    //...
        break;
}

参见有趣的SO Q/A:为什么String.valueOf(null)抛出NullPointerException