Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么对象实例(为null)上的toString()不抛出NPE?_Java_Nullpointerexception - Fatal编程技术网

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");