访问静态字段时出现NullPointerException

时间:2013-04-01 07:59:59

标签: java nullpointerexception

正如他们所说System是最终类,其中PrintStream类型为字段成员,println是PrintStream类中的方法。

我创建了一个类UseNumber,其静态字段为Number类型,只是想访问Number类的方法,但它正在抛出NullPointerException

public class Number {

    private int first;
    private int second;


    public int getFirst() {
        return first;
    }

    public void setFirst(int first) {
        this.first = first;
    }

    public int getSecond() {
        return second;
    }

    public void setSecond(int second) {
        this.second = second;
    }

}

和UseNumber Class

public class UseNumber {
    private static Number no;

    public static void main(String[] args) {
        UseNumber.no.setFirst(12); //throwing nullpointer exception here
        UseNumber.no.setSecond(22);
        System.out.println(UseNumber.no.getFirst()+UseNumber.no.getSecond());

    }


}

3 个答案:

答案 0 :(得分:4)

Re:NullPointerException

setFirst 是一种静态方法,它需要一个Number实例。你没有创建一个。您刚刚声明了一个名为no的Number变量。由于默认情况下它已初始化为null,因此您获得了NullPointerException

解决问题的一种方法:

private static Number no = new Number();

在UseNumber中声明为静态的变量no仅表示您将能够访问此对象而不使用 UseNumber实例。但是这个静态声明不会级联到no的方法。他们仍然需要一个实例,正如您所得到的错误所强调的那样。

Re:System.out

outSystem的静态成员 - 但它已经是实例化的对象。

事实上,如果你查看System的代码,你会发现这一行:

out = com.ibm.jvm.io.ConsolePrintStream.localize(new BufferedOutputStream(new FileOutputStream(FileDescriptor.out)), true);

所以当你说:

System.out

系统将为您提供名为 out 的初始化PrintStream对象。从本质上讲,System.out.println只是一个捷径:

PrintStream p = System.out;
p.println();

答案 1 :(得分:1)

当您尝试通过“。”访问空对象时,将引发nullpointerException。运营商。 在你指示抛出异常的行中,no对象为null,并且你试图访问它的setFirst方法,这当然会抛出一个nullpointer异常。

修复错误,初始化你的no对象,也许是这样:

public class UseNumber {
private static Number no;

public static void main(String[] args) {
    UseNumber.no = new Number(); // Initialize here your no object 
    UseNumber.no.setFirst(12); //This line will no longer throw an exception.
    UseNumber.no.setSecond(22);
    System.out.println(UseNumber.no.getFirst()+UseNumber.no.getSecond());

}

}

答案 2 :(得分:0)

也许你可以编写一个接口方法来获取no的实例。在该方法中,您可以检查它是否为null,类似于我们对Singleton模式的处理方式。

public class UseNumber {
 private static Number no;
 public static getNumberInstance() {
      if(no == NULL) {
         no = new Number(); //This will get executed only once, for first call.
      }
     return no;
 }
 public static void main(String[] args) {
    UseNumber.getNumberInstance().setFirst(12); 
    UseNumber.getNumberInstance().setSecond(22);
    System.out.println(UseNumber.getNumberInstance().getFirst() 
       +UseNumber.getNumberInstance().getSecond());

  }
}