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

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

提问人:abc123 提问时间:11/24/2021 最后编辑:Abraabc123 更新时间:11/24/2021 访问量:69

问:

我在这里感到困惑。 我有 String,我已为其分配 null。因此,当我连接一个 String anotherString=“abc” 时,它会打印“nullabc”。 但是,如果我尝试对 Character 执行相同的操作,如代码中所示,我会得到一个空指针。我想知道为什么会发生这种情况。 我是 Java 的新手,想了解该语言的细微差别。任何帮助都表示赞赏。谢谢!

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 字符串 nullPointerException null

评论


答:

1赞 Abra 11/24/2021 #1

Java 使用自动装箱(实际上,在本例中为取消装箱)将对象转换为基元,并且由于为 null,因此失败。CharactercharnullCharacter

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

如果将 not-null(在代码中命名)转换为 ,则不会得到 .CharactercharacterStringNullPointerException

System.out.println(character.toString() + nullCharacter);
2赞 GeertPt 11/24/2021 #2

Character 类是基元类型的包装类,基元类型是一个 16 位数字。char

如果将两个原始 char 变量相加,则只需将数值相加。

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

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

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

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

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

评论

0赞 Andy Turner 11/24/2021
"char c = a+b;“你需要一个石膏。另外,它是 ,不是 .charValue()toCharValue()
0赞 abc123 11/24/2021
明白了,不知道里面有自动开箱!