2016-07-20 20 views
2

私はラインint length = origin.length();奇妙なエラーが

にNullPointerExceptionが取得しますメインメソッドからの値です。

なぜ実行時にNullPointerExceptionが存在するのですか?コンストラクタ内のコードが実行される前に、長さ属性が設定されているので、origin属性は、まだヌルです:Javaのためのライフサイクルの

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

オブジェクト。

ので、その問題を解決するため、コンストラクタの長さを計算します。

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文字列になります。

そして私は 公共int型get_length(){戻りorigin.lengthによって

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

に代わります(); }

したがって、lengthプロパティは常に実際の原点の長さと適切に関連付けられます。

0

インスタンス(および静的)変数は、(暗黙的または明示的な)super()呼び出しの直後に初期化されます。だからこれはあなたのString起源に何かを割り当てることができる前です。

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; 
    } 

...