20

nullオブジェクトの部分的に nfilled 配列があり、それらを反復処理するときに、選択したオブジェクトが他の操作を行う前にあるかどうかを確認しようとしました。ただし、それnullNullPointerException. array.lengthすべてのnull要素も含まれます。null配列内の要素をどのようにチェックしますか? たとえば、次のコードでは、NPE がスローされます。

Object[][] someArray = new Object[5][];
for (int i=0; i<=someArray.length-1; i++) {
    if (someArray[i]!=null) { //do something
    } 
}
4

9 に答える 9

22

あなたが言ったよりも多くのことが起こっています。あなたの例から次の拡張テストを実行しました。

public class test {

    public static void main(String[] args) {
        Object[][] someArray = new Object[5][];
        someArray[0] = new Object[10];
        someArray[1] = null;
        someArray[2] = new Object[1];
        someArray[3] = null;
        someArray[4] = new Object[5];

        for (int i=0; i<=someArray.length-1; i++) {
            if (someArray[i] != null) {
                System.out.println("not null");
            } else {
                System.out.println("null");
            }
        }
    }
}

期待される出力を得ました:

$ /cygdrive/c/Program\ Files/Java/jdk1.6.0_03/bin/java -cp . test
not null
null
not null
null
not null

someArray[index] の長さを確認しようとしている可能性がありますか?

于 2009-01-08T19:08:49.077 に答える
6

そうではありません。

下記参照。投稿したプログラムは想定どおりに実行されます。

C:\oreyes\samples\java\arrays>type ArrayNullTest.java
public class ArrayNullTest {
    public static void main( String [] args ) {
        Object[][] someArray = new Object[5][];
            for (int i=0; i<=someArray.length-1; i++) {
                 if (someArray[i]!=null ) {
                     System.out.println("It wasn't null");
                 } else {
                     System.out.printf("Element at %d was null \n", i );
                 }
             }
     }
}


C:\oreyes\samples\java\arrays>javac ArrayNullTest.java

C:\oreyes\samples\java\arrays>java ArrayNullTest
Element at 0 was null
Element at 1 was null
Element at 2 was null
Element at 3 was null
Element at 4 was null

C:\oreyes\samples\java\arrays>
于 2009-01-08T19:11:46.917 に答える
2
String labels[] = { "MH", null, "AP", "KL", "CH", "MP", "GJ", "OR" }; 

if(Arrays.toString(labels).indexOf("null") > -1)  {
    System.out.println("Array Element Must not be null");
                     (or)
    throw new Exception("Array Element Must not be null");
}        
------------------------------------------------------------------------------------------         

For two Dimensional array

String labels2[][] = {{ "MH", null, "AP", "KL", "CH", "MP", "GJ", "OR" },{ "MH", "FG", "AP", "KL", "CH", "MP", "GJ", "OR" };    

if(Arrays.deepToString(labels2).indexOf("null") > -1)  {
    System.out.println("Array Element Must not be null");
                 (or)
    throw new Exception("Array Element Must not be null");
}    
------------------------------------------------------------------------------------------

same for Object Array    

String ObjectArray[][] = {{ "MH", null, "AP", "KL", "CH", "MP", "GJ", "OR" },{ "MH", "FG", "AP", "KL", "CH", "MP", "GJ", "OR" };    

if(Arrays.deepToString(ObjectArray).indexOf("null") > -1)  {
    System.out.println("Array Element Must not be null");
              (or)
    throw new Exception("Array Element Must not be null");
  }

特定の null 要素を見つけたい場合は、上記のように for ループを使用する必要があります。

于 2015-08-10T10:35:07.343 に答える
1

与えられたコードは私のために働きます。配列の 2 番目の次元を初期化していないため、someArray[i] は常に null であることに注意してください。

于 2009-01-08T19:09:59.430 に答える
1

まず第一に、そのコードはコンパイルされません。

i++ の後の余分なセミコロンを削除すると、コンパイルして問題なく動作します。

于 2009-01-08T19:11:19.850 に答える
1

サンプル コードは NPE をスローしません。(また、i++ の後ろに「;」があってはなりません)

于 2009-01-08T19:17:41.677 に答える
0

コードがコンパイルされているかどうかにかかわらず、sixe 5 add 2 値の配列を作成してそれらを出力すると言うと、2 つの値が取得され、その他は null になります。問題は、サイズは 5 ですが、配列には 2 つのオブジェクトがあることです。配列に存在するオブジェクトの数を見つける方法

于 2009-04-28T18:08:56.010 に答える