Possible Duplicate:
How come invoking a (static) method on a null reference doesn’t throw NullPointerException?
Static fields on a null reference in Java
我尝试了 this old video 中的代码:
class Impossible {
public static void main(String[] args) {
Thread t = null;
System.out.println(t.currentThread().getName());
}
}
输出:main
好吧,那到底是什么东西?! java.lang.Thread
是否违反了任何 NullPointerException
规则?
但我最感兴趣的是:我怎样才能使该变量的行为抛出 NullPointerException?
Does java.lang.Thread breach any the NullPointerException rule?
否,引发NPE
的原因与类
无关。它与该类的一个实例
相关,在该实例上完成调用。此外,这取决于您正在访问哪种类型的方法或字段。
这里发生的事情是,currentThread()
是 Thread 类的静态方法。这是一个类,而不是一个实例。因此,即使您在 Thread 类的引用上调用它,它实际上也是在类名上调用的。
所以,
Thread t = null
t.currentThread();
实际上被调用为:-
Thread.currentThread();
因此,当通过对象引用表达式访问静态成员时,只有引用的声明类型很重要。这意味着:
How can I make that variable behave to throw a NullPointerException?
好吧,当前的 print 语句永远不会抛出 NPE
。第一部分已经在上面解释过了。现在,让我们继续。
Thread.currentThread();
上述调用永远不会返回null
。它总是返回当前线程实例。而在 Java 中,你总是在一个或另一个线程中。即使在 public static void main
方法中,您也在执行 Main Thread
。因此,currentThread
不能为 null
。
因此,进一步调用:-
Thread.currentThread().getName();
将正常工作,并返回当前线程的名称。