2011-12-06 7 views
0

クラスフィールドを変更する機能コンストラクタかは、私は2つのフィールドを持つ必要があり

public class Pair { 

    public long nr; 
    public Vector<Long> lines; 

    public Pair(long ap, long line){ 
     this.nr=ap; 
     if (line!=0) lines.add(linie); 
     else lines=null; 
    } 

    public void create (long line){ 
     nr++; 
     lines.add(line); 
    } 
} 

は私が機能を(作成)したいので、それはクラスのフィールドを変更します。私が持っているメインクラスでは

Pair per1=new Pair(0,0); 
Pair per2=new Pair(0,0); 

per1.create(3); 
per2.create(4); 

コンストラクタは正常に動作しますが、作成されません。説明は何ですか、そしてその機能はどのように見えますか?ありがとうございます。

+0

コードによると、あなたは '')(作成呼び出すとき、 'lines'はnullです。あなたのコードは 'NullPointerException'を投げるべきです。あなたは正確に何を達成しようとしていますか? – loscuropresagio

答えて

1

あなたのコード内でnew Vector<Long>()を呼び出すことにより、ベクターのインスタンスを作成したことはありません。さらに、クラス変数linesnullに設定する場合は、line == 0です。

あなたのコードは次のようにする必要があります

public class Pair { 

public long nr; 
public Vector<Long> lines = new Vector<long>(); 

public Pair(long ap, long line){ 
    this.nr=ap; 
    if (line!=0) lines.add(linie); 
} 

public void create (long line){ 
    nr++; 
    if (line!=0) lines.add(linie); 
} 

} 
1

コンストラクタ内の行によってVectorがnullに設定されるため、後でその行に追加することはできません。

if (line!=0) lines.add(linie); 
     else lines=null; // <-- cant call add later on lines 

他のパラメータでコンストラクタを呼び出すと、行ベクトルを決して初期化しないので、動作しません。

私はあなたが正確にやろうか知っていますが、

public Vector<Long> lines = new Vector<Long>(); 

にあなたのフィールド定義を変更して、あなたのコンストラクタで、他を削除することができますいけません。

2

2つの問題:

  • あなたのコンストラクタは、非ゼロ値のために働くことはありません。それはNULLポインタ例外をスローします。これは、linesを初期化しないためです。あなたがメンバーとしてまたはコンストラクタでそれを定義するときには、あなたとあなたのコンストラクタを呼び出すときにnullに変数linesを設定するので、あなたは常にnullポインタ例外が発生します

  • lines = new Vector<Long>();として)のいずれか、それを初期化する必要があります。 引数は0です。その後createを呼び出すと、lines.add(line)が実行されたときにNULLポインタ例外が発生します。

    lines = new Vector<Long>(); 
    
    if(line != 0) { 
        lines.add(line); 
    } 
    

    お知らせ何elseはありません:私はこのような何かをするだろうあなたの問題を解決するために

linesnullに設定する必要がある理由がわかりませんが、その場合は後で使用できなくなります。それはあなたのクラスのユーザーに混乱を招くようになるかなり奇妙な副作用です。

その他のいくつかのポインタ。

  • 適切なJavaの構文と命名規則を使用してください。あなたのifelseを常に中かっこで囲んでください:

    if(line!= 0){ lines.add(line); }他{ ... }

    • 使用説明的な変数名。 nrおよびapはあまり明確ではない。
    • nrlinesは本当にpublicである必要がありますか?これはルールではなく例外です。
+0

コンストラクターは0以外何も呼び出さないので動作しています。 – Stefan

+0

@Stefan良い点 - 修正します。 –

0

まずオフを、私はクラスの名前は、行動と一致するかわかりません。 nrのような名前は、コードの操作が非常に困難です。より意味のあるものに名前を変更することを検討してください。

重要な点は、Vectorオブジェクトを決して作成せず、参照のみです。

ので、私はあなたのコンストラクタがこれを行うになるだろう。

public Pair(long ap, long line){ 
    this.nr=ap; 
    lines = new Vector<Long>(); 
    if (line!=0) lines.add(line); 
} 
1

あなたlinesベクトルが初期化されることはありません。 0以外の値でコンストラクタを呼び出すと、NullPointerExceptionがスローされます。

フィールド宣言をVector<Long> lines = new Vector<Long>();に変更するか、コンストラクタの先頭でlines = new Vector<Long>();を呼び出して、2番目の引数の値が0の場合は何もしないでください。

0

行のコンストラクタがありません。ラインの定義におけるたり、ラインを初期化する必要がペアのコンストラクタのいずれかで

lines = new Vector<Long>(); 
関連する問題