Java 为什么对象实例(为null)上的toString()不抛出NPE?
考虑以下一点:Java 为什么对象实例(为null)上的toString()不抛出NPE?,java,nullpointerexception,Java,Nullpointerexception,考虑以下一点: Object nothingToHold = null; System.out.println(nothingToHold); // Safely prints 'null' 这里,Sysout必须是字符串。 所以必须在实例上调用toString() 那么为什么null.toString()工作得很好呢?Sysout负责这件事吗 编辑:实际上我在StringBuilder的append()中看到了这个奇怪的东西。所以用Sysout试过了。两者的行为方式相同。那么该方法是否
Object nothingToHold = null;
System.out.println(nothingToHold); // Safely prints 'null'
这里,Sysout必须是字符串。
所以必须在实例上调用toString()
那么为什么null.toString()工作得很好呢?Sysout负责这件事吗
编辑:实际上我在StringBuilder的append()中看到了这个奇怪的东西。所以用Sysout试过了。两者的行为方式相同。那么该方法是否也能起作用呢?该方法调用该方法,该方法首先检查参数是否为null
,如果是,则只需将“null”
设置为打印为普通字符串
但是,传递给.print()
方法的是“null”
作为String
,因为String.valueOf(String s)
在调用.print()
方法之前返回“null”
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
PrintWriter
的println(Object)
(这是在编写System.out.println(nothingToHold)
时调用的方法)调用String.valueOf(x)
,如Javadoc中所述:
/**
* Prints an Object and then terminates the line. This method calls
* at first String.valueOf(x) to get the printed object's string value,
* then behaves as
* though it invokes <code>{@link #print(String)}</code> and then
* <code>{@link #println()}</code>.
*
* @param x The <code>Object</code> to be printed.
*/
public void println(Object x)
String.valueOf(Object)
将空值转换为“空值”:
以下是println()的文档
打印后跟换行符的字符串。字符串被转换为
使用在构造过程中选择的编码的字节数组
这条小溪。然后将字节写入目标流,并使用
写入(int)
如果发生I/O错误,则此流的错误状态设置为true
NULL
可以转换为字节
Object nothingToHold = null;
System.out.println(nothingToHold != null ? nothingToHold : "null String or any thing else");
如果nothingToHold(对象)不等于null,则会显示输出,否则会将消息打印为“null字符串或任何其他内容”,因为null
不是对象,因此没有属性或方法println()
需要Object
,而不是String
,并检查它本身是否为null
。println(Object)
将被调用。它不是一个字符串
变量,而是一个对象
编译器不会查看值内部以决定调用什么。如果它被称为list so:println(null)
,则唯一一次是这样的:println(null)
,因此现在它调用String.valueOf
,正是它引入了“null”
字符串。@weston-Ya。你说得对:)。。我尝试将null
直接传递给自定义方法。一旦分配了引用,它将使用实际引用:)来清除对象。如果对象为空,toString()
将保证NPE。你自己试试看System.out.println()。PrintWriter知道传递空引用的时间,因此它将优雅地传递并打印出null
。但是如果您尝试从null
调用toString()
,它肯定会抛出NPE。
Object nothingToHold = null;
System.out.println(nothingToHold != null ? nothingToHold : "null String or any thing else");