Java 为什么`switch(null)`是一个编译错误,而`switch(str)`可以将str设置为`static final String str=null;`?

Java 为什么`switch(null)`是一个编译错误,而`switch(str)`可以将str设置为`static final String str=null;`?,java,null,switch-statement,constants,compile-time-constant,Java,Null,Switch Statement,Constants,Compile Time Constant,虽然switch(null)是一个编译错误,但是switch(str)是可以的(str是静态最终字符串str=null;) 不是静态最终字符串str=null编译时常量,在编译时应替换为开关(str),因此相当于开关(null) 但是: 另外,我假设静态最终字符串str=null不是编译时常量,因为只有静态最终字符串str='String literal'是编译时常量,这解释了上面的示例(s4)。来自: 与if-then和if-then-else语句不同,switch语句可以 有许多可能的执行路

虽然
switch(null)
是一个编译错误,但是
switch(str)
是可以的(
str
静态最终字符串str=null;

不是
静态最终字符串str=null
编译时常量,在编译时应替换为
开关(str)
,因此相当于
开关(null)

但是:

另外,我假设
静态最终字符串str=null
不是编译时常量,因为只有
静态最终字符串str='String literal'
是编译时常量,这解释了上面的示例(s4)。

来自:

与if-then和if-then-else语句不同,switch语句可以 有许多可能的执行路径。一个开关与一个开关一起工作 byte、short、char和int基元数据类型。它也适用于 枚举类型(在枚举类型中讨论)、字符串类和 很少有特殊类包装某些基本类型:Character, 字节、短字符和整数(在数字和字符串中讨论)


因此
switch(null)
无效,因为您无法从错误消息中打开任何值(
null
可能是不受支持的null
bana
对象)

不兼容的类型。找到“null”,必需:“char、byte、short、int、Character、byte、Integer、String或枚举”

您可以看到,
null
被推断为空,它甚至不是一个
对象
,它只是一个“null类型”,而不是一个
字符串
(或任何其他有效的可切换类型)

因此,要对其进行编译,您需要将其转换为
String
(或其他有效类型之一)

当您试图执行它时,它会抛出一个
运行时异常

此行为不仅适用于
开关
,实际上与您执行此操作时相同:

null.isEmpty()

java如何知道要调用
String#isEmpty()
?你也可以指
集合#isEmpty()
。或任何其他
isEmpty()
方法。
开关的情况也是如此,例如,java根本不知道您指的是哪种类型。

试试
开关((字符串)null)
-这只是类型问题。我得到的错误解释性很强,“无法切换null类型的值。只允许可转换的int值、字符串或枚举变量”编译器给出的错误是什么?把它包括在问题中总是很好的。按照同样的逻辑,您应该期望在
str
上执行的任何操作都会出现编译时错误,例如:
str.concat(“”)
public class Test {

    // compile-time constant?
    static final String s4 = null; 

    public static void main(String[] args) {

        switch (s4) {  // compiles fine! NPE at runtime

        }
    }
}
switch((String) null) {
null.isEmpty()