为什么Java中可拼接null String却无法拼接null Character?
Java中null值字符串拼接无异常、包装类算术运算抛空指针的底层逻辑
1. 为什么String拼接null不会抛出空指针
Java语言规范中明确规定,字符串拼接运算符+在遇到引用类型的操作数时,会先将其转换为字符串再执行拼接,转换逻辑等价于调用String.valueOf(Object obj):
- 当
obj为null时,String.valueOf会直接返回字符串"null",不会调用对象的任何实例方法,因此不会触发空指针异常。
你的代码中nullString + "abcdefgh"会被编译器自动优化为类似以下逻辑:
new StringBuilder().append(nullString).append("abcdefgh").toString()
StringBuilder.append(Object)方法内部就是调用String.valueOf处理入参,自然就输出nullabcdefgh。
2. 为什么包装类相加会抛出空指针
Character、Integer这类都是基本类型的包装类,当包装类对象参与算术运算(+、-、*、/等)时,编译器会执行自动拆箱逻辑:把包装类对象转换为对应的基本类型,转换逻辑是调用包装类的实例方法,比如Character.charValue()、Integer.intValue()。
你的代码中nullCharacter + character的执行逻辑如下:
- 两个
Character类型的操作数都要先自动拆箱为char基本类型 - 拆箱
nullCharacter时,等价于执行null.charValue(),调用null对象的实例方法,直接触发空指针异常。
补充说明
如果包装类是和字符串执行+拼接,就不会触发空指针,因为此时+是字符串拼接运算符,走的是String.valueOf的逻辑:
System.out.println(nullCharacter + "abc"); // 输出nullabc,无异常
内容的提问来源于stack exchange,提问作者abc123
相关产品推荐
相关产品推荐

