2

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

我创建了一个类型UseNumber为 no 的静态字段的类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 类

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

    }


}
4

3 回答 3

4

回复:空指针异常

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

一种解决方法:

private static Number no = new Number();

在 UseNumber 中声明为静态的变量no仅意味着您将能够在没有UseNumber 实例的情况下访问该对象。但是这个静态声明不会级联到no. 正如您遇到的错误所强调的那样,它们仍然需要一个实例。

回复:System.out

out是的静态成员System- 但它已经是一个实例化的对象。

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

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

所以当你说:

System.out

系统会给你它初始化的 PrintStream 对象调用本质上,System.out.println这只是一个捷径:

PrintStream p = System.out;
p.println();
于 2013-04-01T08:04:54.273 回答
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());

}

}

于 2013-04-01T08:17:33.370 回答
0

也许你可以写一个接口方法来获取no的实例。在该方法中,您可以检查它是否为空,类似于我们使用单例模式的方式。

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

  }
}
于 2013-04-01T09:12:09.113 回答