为什么我可以将字符串连接到空字符串,但不能将字符连接到空字符?

Why am I able to concatenate a String to a null String but not a Character to a null Character?

我在这里感到困惑。 我有 String ,我已将其分配为 null 。因此,当我连接一个字符串 anotherString="abc" 时,它会打印出“nullabc”。 但是,如果我尝试对一个字符执行相同的操作,如代码所示,我将得到一个空指针。我想了解它为什么会发生。 我是 Java 的新手,想了解 language.Any 帮助的细微差别。谢谢!

String nullString=null;
Character nullCharacter=null;
Character character=new Character('k');
Integer nullInteger=null;

System.out.println(nullString+"abcdefgh");//prints-"nullabcdefgh"
System.out.println(nullCharacter+character);// throws null pointer exception

Java 使用 autoboxing (实际上,在这种情况下,拆箱)将 Character 对象转换为 char 原语,但由于 nullCharacter 为空。

自动装箱仅影响包装图元的 类,因此不适用于 String

如果您将非空 Character(在您的代码中命名为 character)转换为 String,您将不会得到 NullPointerException

System.out.println(character.toString() + nullCharacter);

字符 class 是 char 基本类型的包装器 class,它是一个 16 位数字。

如果将两个原始 char 变量加在一起,它只是将数值相加。

    char a = 'a';
    char b = 'b';
    char c = (char)(a+b); // c == 'Ã'

使用字符包装器对象的 nullCharacter+character 语法只有在自动拆箱的情况下才有可能(在 Java 1.5 中引入)。它会将其隐式转换为数字加法:

    nullCharacter.charValue() + character.charValue() // throws NPE

另一方面,将两个字符串相加 nullString+"abcdefgh" 是在 Java 一开始就引入的字符串连接操作,该操作对空值的处理方式不同。理论上它是特定于编译器的,但大多数编译器都是这样实现的:

new StringBuilder()
    .append(nullString)  // implicitly converts null to "null"
    .append("abcdefgh")
    .toString()