2

次のコードがあります。

for (int i=0; i<wallMaterialName.size(); i++){
if (Math.abs(calculatedWallUValue - alternativeWallUValue) > 0.01){
   if(wallMaterialName.get(i).charAt(0) == 'A'){                   //*****ERROR IN HERE*****
      PreparedStatement prepStateMat = con.prepareStatement("select * from concretestonefloor where value<? order by value desc limit 1");
      prepStateMat.setFloat(1, (Float)wallMaterialLambda.get(i));
      ResultSet rsMaterial = prepStateMat.executeQuery();
      //...
      }
  //...
  }
}

コードを実行すると、「java.lang.NullPointerException」が表示されます。エラーは次のコードから発生します。

if(wallMaterialName.get(i).charAt(0) == 'A')

データが含まれていることを確認したため、arraylist が空である理由がわかりません。誰でもこの問題を解決する方法を知っていますか? ありがとう。

4

3 に答える 3

6

配列リストは空ではありません。そうしないと、インデックスの範囲外の例外が発生します(ループがチェックするため、コードで生成することはできませんi < wallMaterialName.size())。ただし、配列リストにはnullインデックスにオブジェクトが含まれていますi

エラーを修正するには、コードを次のように変更します。

String materialName = wallMaterialName.get(i);
if(materialName != null && materialName.charAt(0) == 'A') ...
于 2012-10-29T12:30:19.807 に答える
2

リストが空の場合、エラーは発生しません。実際にはarraylistには要素が含まれていますが、要素はそうnullであり、それがあなたのNullPointerException. リストを満たすコードを示していただければ、さらにお役に立てるかもしれません。

別の注意: インデックス付けによってリストを反復処理しないでください:拡張された for構文を使用してください:

for (String element : wallMaterialName) ...

これにより、少なくとも、存在しない要素を繰り返し処理することについての心配が解消されます。2 つの並列リストに同じインデックスを使用する方法は、その点でも設計が改善される可能性があることを示しています。最初のリストの文字列と 2 番目のリストの浮動小数点数の両方を含む、カスタム オブジェクトの 1 つのリストが必要です。

于 2012-10-29T12:30:01.757 に答える
0

あなたのarraylistwallMaterialNameには、インデックスiにnull値があります。以下のテストを行ったことindexを知るために。null value

for(int i=0; i<al.size(); i++){
            if(al.get(i)==null){
                System.out.println(i);
            }
        }
于 2012-10-29T12:32:50.700 に答える