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
可能是不受支持的nullbana
对象):
不兼容的类型。找到“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()