正如他们所说,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());
}
}
最佳答案
回复:NullPointerException
setFirst
不是静态方法,它需要 Number 的实例。你没有创造一个。您刚刚声明了一个名为 no
的 Number 变量。由于默认情况下它初始化为 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
系统将为您提供名为out的初始化PrintStream对象。本质上,System.out.println
只是一个快捷方式:
PrintStream p = System.out;
p.println();
关于java - 访问静态字段时出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15739800/