为什么“switch(null)”是一个编译错误,但“switch(str)”很好,str是“静态最终字符串str =



虽然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对象(

最新更新