正如他们所说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());
}
}
答案 0 :(得分:4)
setFirst
不是一种静态方法,它需要一个Number实例。你没有创建一个。您刚刚声明了一个名为no
的Number变量。由于默认情况下它已初始化为null,因此您获得了NullPointerException
。
解决问题的一种方法:
private static Number no = new Number();
在UseNumber中声明为静态的变量no
仅表示您将能够访问此对象而不使用 UseNumber实例。但是这个静态声明不会级联到no
的方法。他们仍然需要一个实例,正如您所得到的错误所强调的那样。
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();
答案 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());
}
}