[英]NullPointerException when accessing a static field
正如他們所說的那樣,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類
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());
}
}
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
系統將為您提供其初始化的PrintStream對象out 。 本質上, System.out.println
只是此操作的快捷方式:
PrintStream p = System.out;
p.println();
當您嘗試通過“。”訪問空對象時,將引發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());
}
}
也許您可以編寫一個接口方法來獲取no的實例。 在方法中,您可以檢查它是否為空,類似於我們對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());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.