java - 强制方法调用 null 变量以抛出 NullPointerException

标签 java multithreading null nullpointerexception operation

<分区>

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

因此,当通过对象引用表达式访问静态成员时,只有引用的声明类型很重要。这意味着:

  • 引用是否实际指向 null 并不重要,因为没有 需要实例。

  • 如果引用不为空,那么类型是什么并不重要 引用指向的对象,没有动态调度。


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

将正常工作,并返回当前线程的名称。

关于java - 强制方法调用 null 变量以抛出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13540037/

相关文章:

java - 由于配置异常,Eclipse Neon 无法启动

c# - 如何从另一个线程通知等待任务完成?

java - 多线程同步问题

iOS 多线程问题

java - 从外部类修改基类中的内容并从派生类访问它

java - 在 Java 中使用 kerberos 票证获取 AD 组

java - 无法检索 urlencoded 变音符号。 [解决方案: use UTF8]

Java getMethod 抛出方法未找到异常?

null - 是否有 erlang null 语句

iPhone - 无法访问 IBOutlet(零值)