Java 1.8中Character类变量赋值null为何触发空指针异常?
问题原因分析
你的代码抛出空指针异常的核心原因是Java三元运算符的类型自动推导与拆箱机制,和Character类是否支持null赋值无关,Character作为包装类本身是可以被赋值为null的。
具体触发逻辑
Java的三元运算符存在类型提升规则:当表达式中同时存在基本类型和引用类型的返回值时,编译器会优先将整个表达式的类型推导为基本类型,触发自动拆箱:
- 你代码里三元运算的前两个分支返回的都是
char基本类型字面量,第三个分支返回的是null - 编译器会将整个三元表达式的类型判定为
char基本类型,而非你预期的Character包装类 - 你测试用的字符串
blah既不包含/也不包含\,会走到第三个分支返回null,此时JVM需要将null转换为char基本类型,会自动调用null.charValue()完成拆箱,直接触发空指针异常。
修复方案
只需要将前两个分支的返回值显式声明为Character包装类,让编译器将整个表达式的类型推导为Character即可避免拆箱:
public class Playground { public static void main(String[] args) { String s = "blah"; // 显式将字面量转为Character包装类,避免类型推导为基本类型char Character lclfs = s.contains("/") ? Character.valueOf('/') : s.contains("\\") ? Character.valueOf('\\') : null; } }
也可以通过强制类型转换实现同样效果:
Character lclfs = s.contains("/") ? (Character)'/' : s.contains("\\") ? (Character)'\\' : null;
内容的提问来源于stack exchange,提问作者JGFMK
相关产品推荐
相关产品推荐

