2016-07-20 42 views
2

當我運行這段代碼我得到線int length = origin.length();用簡單的代碼奇怪的錯誤

的NullPointerException異常。如果我在它採空在同一行,但在變量選項卡中的origin值,因爲它可能是調試模式下運行即來自主要方法的值。

那麼爲什麼在運行時出現NullPointerException?

public static void main(String[] args) { 

     String regexp = "(?:a)"; 
     Task t = new Task(regexp); // error 
     t.process(); 

    } 


class Task { 

    private String origin; 

    public Task() { 
    } 

    public Task(String origin) { 
     this.origin = origin; 
    } 

    public void setOrigin(String origin) { 
     this.origin = origin; 
    } 

    public String getOrigin() { 
     return origin; 
    } 

    int length = origin.length(); //NullPointerException 
... 
+3

提示:http://stackoverflow.com//questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it – Jens

+0

嘗試移動該行的構造函數內 – depperm

回答

1

由於Java的生命週期的對象:執行構造函數的代碼之前的長度屬性設置,所以產地屬性仍然是零。

計算在構造函數中的長度,以便解決該問題:

public Task (String o) { 
    this.origin=o; 
    this.length=this.origin.length(); 
} 

,然後更新二傳手:

public void setOrigin(String origin) { 
    this.origin = origin; 
    this.length=origin.length; 
} 

或者只是創建長度的getter和不存儲該值(在我看來,最好的選擇):

2

當初始化y時,原點沒有初始化我們的length變量。它設置爲零,並初始化起源是這樣的:

private String origin = new String(); 

origin變量將是一個null字符串之前,它是通過你的setter設置。

而且我會通過 公衆詮釋get_length(){回報origin.length更換

int length = origin.length(); //NullPointerException 

(); }

所以長度屬性總是與實際原點長度正確相關。

0

實例(和靜態)變量在對(super)()(隱式或顯式)調用之後進行初始化。所以這是你可以分配任何東西到你的字符串的原點。

0

根據不同的領域照顧初始化字段!在調用構造函數之前,JVM嘗試初始化它們!

public static void main(String[] args) { 

     String regexp = "(?:a)"; 
     Task t = new Task(regexp); // error 
     t.process(); 

    } 


class Task { 

    private String origin; 
    private int length; 

    public Task() { 
     //optional - depending on what you like/need 
     origin = new String(); 
     length = 0; 
    } 

    public Task(String origin) { 
     this.origin = origin; 
     this.length = origin.length(); 
    } 

    public void setOrigin(String origin) { 
     this.origin = origin; 
     this.length = origin.length(); 
    } 

    public String getOrigin() { 
     return origin; 
    } 

...