虽然switch(null)
是编译错误,但switch(str)
很好(str
正在static final String str = null;
(。
static final String str = null;
不是编译时常量,应该在编译时代入switch(str)
,从而等效于switch(null)
吗?
switch (null) { // compile Error immediately!
}
但:
public class Test {
// compile-time constant?
static final String s4 = null;
public static void main(String[] args) {
switch (s4) { // compiles fine! NPE at runtime
}
}
}
附言我想static final String str = null;
不是编译时常量,因为只有static final String str = 'string literal'
是编译时常量,这解释了上面的例子(s4(。
从错误消息:
不兼容的类型。找到"null",必需:"字符、字节、短整型、整型、字符、字节、整数、字符串或枚举">
你可以看到null
被推断为无,它甚至不是一个Object
,它只是"null类型",而不是String
(或任何其他有效的可切换类型(。
因此,要编译它,您需要将其转换为String
(或其他有效类型之一(。
switch((String) null) {
然后,当您尝试执行它时,它会抛出一个RuntimeException
。
此行为不仅适用于switch
实际上与您执行此操作时相同:
null.isEmpty()
java 应该如何知道你想要调用String#isEmpty()
?你也可以说Collection#isEmpty()
.或任何其他isEmpty()
方法。switch
也是如此 - 例如,java根本不知道你指的是哪种类型。
来自 Oracle 的文档:
与 if-then 和 if-then-else 语句不同,switch 语句可以 具有许多可能的执行路径。交换机与 字节、短整型、字符和整数基元数据类型。它也适用于 枚举类型(在枚举类型中讨论(、String 类和 包装某些基元类型的几个特殊类:字符, 字节、短整型和整数(在数字和字符串中讨论(。
因此switch(null)
无效,因为您无法打开任何值(null
可能是不支持的空Banana
对象(