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



我有一个困惑。我有一个字符串,我给它赋值为null。所以当我连接一个字符串时,另一个字符串=";abc";,它打印";nullabc";。但是,如果我尝试对Character执行同样的操作,如代码中所示,我会得到一个空指针。我想知道为什么会发生这种事。我是Java的新手,想了解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

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

如果你把两个基元char变量加在一起,它只会加上数值。

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

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

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

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

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

Java使用自动装箱(在本例中实际上是取消装箱(将Character对象转换为char基元,但由于nullCharacter为null,因此失败。

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

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

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

最新更新