为什么此代码不返回 NullPointerException?

2022-09-03 03:39:30
public class Main
{
   public static void main(String []ar)
   {
      A m = new A();
      System.out.println(m.getNull().getValue());
   }
}

class A
{
   A getNull()
   {
      return null;
   }

   static int getValue()
   {
      return 1;
   }
}

我在SCJP的一本书中遇到了这个问题。代码将打印出来,而不是预期的 NPE。有人可以解释一下同样的原因吗?1


答案 1

基本上,您正在调用静态方法,就好像它是实例方法一。这只会被解析为静态方法调用,所以它就像你写了:

A m = new A();
m.getNull();
System.out.println(A.getValue());

IMO,你的代码是合法的,这是Java中的一个设计缺陷。它允许您编写非常误导性的代码,作为我经常使用的示例:Thread.sleep

Thread thread = new Thread(someRunnable);
thread.start();
thread.sleep(1000);

哪个线程会发送到睡眠状态?目前的一个,“当然”...


答案 2

它根据 Java 语言规范的行为符合预期:

空引用可用于访问类(静态)变量,而不会导致异常。


推荐