我正在尝试字符串连接和' +'字符串上的运算符并遇到以下内容 -
String xyz = "Hello" + null;
System.out.println("xyz= " +xyz);
String abc= "Hello".concat(null);
System.out.println("abc= " +abc);
第一个的输出是: Hellonull
第二个输出是空指针异常
我不明白为什么有两种不同的输出。
答案 0 :(得分:2)
当您通过null
运算符连接+
时,它始终会转换为" null"串。这解释了第一个输出Hellonull。
concat函数在内部看起来像这样:
public String concat(String s) {
int i = s.length();
if (i == 0) {
return this;
} else {
char ac[] = new char[count + i];
getChars(0, count, ac, 0);
s.getChars(0, i, ac, count);
return new String(0, count + i, ac);
}
}
来源:String concatenation: concat() vs "+" operator
如您所见,它调用s.length(),在您的情况下为null.length();这导致String abc= "Hello".concat(null);
语句的NullPointerException。
编辑:我只是反编译了我自己的String.concat(String s)函数,它的实现看起来有点不同,但是NullPointerException的原因保持不变。
答案 1 :(得分:2)
来自Docs
If the reference is null, it is converted to the string "null" (four ASCII characters n, u, l, l).
Otherwise, the conversion is performed as if by an invocation of the toString method of the referenced object with no arguments; but if the result of invoking the toString method is null, then the string "null" is used instead.
答案 2 :(得分:0)
"Hello" + null
返回与"Hello".concat(String.valueOf(null))
相同的结果。
String.valueOf(null)
返回字符串" null"。
答案 3 :(得分:0)
/**
* Concatenates this string and the specified string.
*
* @param string
* the string to concatenate
* @return a new string which is the concatenation of this string and the
* specified string.
*/
public String concat(String string) {
if (string.count > 0 && count > 0) {
char[] buffer = new char[count + string.count];
System.arraycopy(value, offset, buffer, 0, count);
System.arraycopy(string.value, string.offset, buffer, count, string.count);
return new String(0, buffer.length, buffer);
}
return count == 0 ? string : this;
}
源代码的联系函数的第一行调用null的计数。所以它会抛出空指针异常。
答案 4 :(得分:0)
在空引用上调用concat()会产生NPE,因此“+”运算符会将空引用视为“null”,因此会产生不同的结果。