簡體   English   中英

訪問靜態字段時發生NullPointerException

[英]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());

    }


}

回復:NullPointerException

setFirst 不是靜態方法,它需要Number的實例。 您沒有創建一個。 您剛剛聲明了一個名為no的Number變量。 由於默認情況下將其初始化為null,因此您將獲得NullPointerException

解決它的一種方法:

private static Number no = new Number();

在UseNumber中no被聲明為靜態的變量只是意味着您將可以在沒有 UseNumber實例的情況下訪問此對象。 但是,此靜態聲明不會套用到no方法。 正如您所得到的錯誤所強調的那樣,它們仍將需要一個實例。

回復:System.out

outSystem的靜態成員-但它已經是實例化的對象。

實際上,如果查看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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM