为什么我可以将 class 设置为 null,然后仍然从中调用方法?
Why can I set the class to null and still call methods from it afterwards?
我在 Java 中创建了以下示例代码:
public class SetClassNullExperiment {
public static void main(String[] args) {
SetMeNull c1 = new SetMeNull();
c1.setInputToNull(c1);
System.out.println("Is c1 equal to null? " + Boolean.toString(c1 == null)); // false
c1.printHelloWorld();
SetMeNull c2 = new SetMeNull();
c2 = null;
System.out.println("Is c2 equal to null? " + Boolean.toString(c2 == null)); // true
c2.printHelloWorld(); // Throws a NullPointerException (For obvious reasons...)
}
}
class SetMeNull {
/**
* Set the input class equal to <code>null</code>.
*/
public void setInputToNull(SetMeNull c) {
c = null;
}
public void printHelloWorld() {
System.out.println("Hello World!");
}
}
为什么在调用 c1.setInputToNull(c1)
之后还能调用 c1.printHelloWorld()
?我希望在调用 c1.printHelloWorld()
时出现 NullPointerException
。为什么不是这样呢?在我看来,前四行(c1
)等于最后四行(c2
),但只有在最后四行才会抛出一个NullPointerException
。
这两个例子不一样。首先,您要设置对 null
的引用的副本(参见 this)。如果您要在 setInputToNull
内调用 c
上的方法,您会在那里得到 NPE。
我在 Java 中创建了以下示例代码:
public class SetClassNullExperiment {
public static void main(String[] args) {
SetMeNull c1 = new SetMeNull();
c1.setInputToNull(c1);
System.out.println("Is c1 equal to null? " + Boolean.toString(c1 == null)); // false
c1.printHelloWorld();
SetMeNull c2 = new SetMeNull();
c2 = null;
System.out.println("Is c2 equal to null? " + Boolean.toString(c2 == null)); // true
c2.printHelloWorld(); // Throws a NullPointerException (For obvious reasons...)
}
}
class SetMeNull {
/**
* Set the input class equal to <code>null</code>.
*/
public void setInputToNull(SetMeNull c) {
c = null;
}
public void printHelloWorld() {
System.out.println("Hello World!");
}
}
为什么在调用 c1.setInputToNull(c1)
之后还能调用 c1.printHelloWorld()
?我希望在调用 c1.printHelloWorld()
时出现 NullPointerException
。为什么不是这样呢?在我看来,前四行(c1
)等于最后四行(c2
),但只有在最后四行才会抛出一个NullPointerException
。
这两个例子不一样。首先,您要设置对 null
的引用的副本(参见 this)。如果您要在 setInputToNull
内调用 c
上的方法,您会在那里得到 NPE。