2011-01-31 12 views
2

これを説明するのを手伝ってください。私はあなたが代わりにあなたが行き続ける、ループを終了していない見つからない場合は、あなたの助けArrayList関連デバッグ質問

+0

リストではなくマップを使用する必要があるようです。 – rfeak

+0

スタックトレースも投稿できますか? – CoolBeans

+0

見つかりクライアント:QBEホールディングス wisconsinrx.mainuserinterface.populate_helperでwisconsinrx.mainuserinterface.v_button_opendataActionPerformedで(mainuserinterface.java:498) (mainuserinterface.java:546) でwisconsinrx.mainuserinterface.access $ 000(mainuserinterface.java:32 )wisconsinrx.mainuserinterface $ 1.actionPerformedで (mainuserinterface.java:172)javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995で )javax.swing.AbstractButton $ Handler.actionPerformedで (AbstractButton.java:2318) – Scicare

答えて

2

ラインとしてこれを取ると例外が発生する上:

while(!customer.get(temp_index).name.equals(dataset[a][CLIENT_NAME])){ 

問題を呼び出すことができ、物事の数があります。まず、customerはnullでもかまいません。第2に、customer.get(temp_index)の結果はnullとなる可能性があります。最後に、customer.get(temp_index).nameはnullでもかまいません。

ここでは完全なコードセットを扱っているわけではないので、上記の各項目に値をプリントアウトして、nullを解決するか、デバッガを使用することをお勧めします。例外の原因を正確に見ることができます。私の推測では、顧客の名前はnullに設定されて問題を引き起こす可能性がありますが、それは私が言及した他のもののいずれかと同じように簡単になる可能性があります。

+1

'CLIENT_NAME'はintであるように見え、数行前に使用されているので、nullではありません(アンボックスの' Integer'の場合)。 :)しかし、それ以外のあなたは正しいです。 – biziclop

+0

私はそれが「整数」になる可能性があるという事実についていましたが、以前の使用法は忘れました。それを指摘してくれてありがとう、私は適切に編集します。 – berry120

1

いただきありがとうございます、これはnullポインタ例外

/* Try to find customer in customer list, if not in list add to list with a 
new plan; otherwise add additional plan to customer*/ 


for(int a = 0; a < dataset.length; a++){ 

     if(customer_name_list.contains(dataset[a][CLIENT_NAME])){ 
      int temp_index = 0; 

//NULLPOINTEREXCEPTION OCCURRED ON THE FOLLOWING LINE 
      while(!customer.get(temp_index).name.equals(dataset[a][CLIENT_NAME])){ 
       temp_index++; 
      } 
      customer.get(temp_index).add_plan(dataset[a][PLAN], dataset[a][DETAIL]); 
     } 

     else{ 
       Customer temp_customer = new Customer(dataset[a][CLIENT_NAME], dataset[a][PLAN], dataset[a][DETAIL]); 

     customer.add(temp_customer); 
     customer_name_list.add(dataset[a][CLIENT_NAME]); 
     } 
    } 

を作る理由を見つけ出すように見えることはできません。カウンターや句を追加して、あなたが行き過ぎないようにしてください。

1

customerコレクション、またはその要素の1つ、または要素の1つのnameフィールドがnullです。私は実際にはcustomerコレクションに何が入っているかを見ることなく、何も言い表すことができません。

しかし、何らかの種類のログファイルでループ内にtemp_indexを印刷して、何回の繰り返しが完了するかを確認することをお勧めします。

便利な点は、特に、アクセスされているデータがほとんど分からない場合は、同じ行に複数の逆参照演算子(.)が存在しないようにすることです。

private String getCustomerName(int index) { 
    Customer c = customer.get(index); 
    return c.name; 
} 

をそして、あなたのwhileループでそれを使用します。

は、次の例のヘルパーメソッドを作成することができます。

関連するものはありませんが、他にも指摘されているように、一致する要素が見つからない場合、ループはIndexOutOfBoundsExceptionで終了するため、修正する必要があります。

1
for (dataA : dataset) { 
if (customer_name_list.contains(dataA[CLIENT_NAME])) { 
    for (c : customer) if (dataA[CLIENT_NAME].equals(c.name)) { 
    c.add_plan(dataA[PLAN], dataA[DETAIL]); 
    break; 
    } 
} else { 
    customer.add(new Customer(dataA[CLIENT_NAME], dataA[PLAN], dataA[DETAIL])); 
    customer_name_list.add(dataA[CLIENT_NAME]); 
} 
} 

これはあなたがやっていることで、クリーナーだけです。ルックアップと検索呼び出しを改善するために、ハッシングデータ構造(たとえば、HashMap)またはソートされたデータ構造に切り替えることをお勧めします。そして、上記のは、脳に容易になるように加えて、よりよい性能面で、

for (data : dataset) { 
if ((Customer c = customer_map.get(data[CLIENT_NAME]))!=null) { 
    c.add_plan(data[PLAN], data[DETAIL]); 
} else { 
    customer_map.put(data[CLIENT_NAME], new Customer(data[CLIENT_NAME], data[PLAN], data[DETAIL])); 
} 
} 

ようになります。インサートオーダーベースの繰り返しのような他のものが必要な場合は、適切なマップフレーバーを使用できます。 temp_indexの項目はnullある(とnameを得ることはNPEがスローされます)のいずれか、またはnamenull、その上にequalsを呼び出そうとしている - あなたが取り出されてきた項目が正しく初期化されていないことを意味

NPEに関しては

、 NPEを投げるインデックスが存在しない場合は、範囲外スタイルの例外が発生します。

関連する問題