配列がnull /空かどうかを確認するにはどうすればよいですか?


137

私が持っているint要素を持たない配列を、私はそれが空だかどうかを確認しようとしています。

たとえば、以下のコードのifステートメントの条件が真にならないのはなぜですか?

int[] k = new int[3];

if (k == null) {
    System.out.println(k.length);
}

コードをもう少し投稿していただけませんか?配列が初期化されているビットを確認すると便利です。
Mark Pope

私はあなたが何を求めているのかわかりません。Surellyが配列がnullかどうかを確認するには(array == null)
Paul

7
(k!= null)の場合は
不要

回答:


214

null配列と空の配列の間には重要な違いがあります。これはのテストですnull

int arr[] = null;
if (arr == null) {
  System.out.println("array is null");
}

ここでの「空」には公式の意味はありません。空を0要素として定義することにしました。

arr = new int[0];
if (arr.length == 0) {
  System.out.println("array is empty");
}

「空」の代替定義は、すべての要素がnull次の場合です。

Object arr[] = new Object[10];
boolean empty = true;
for (int i=0; i<arr.length; i++) {
  if (arr[i] != null) {
    empty = false;
    break;
  }
}

または

Object arr[] = new Object[10];
boolean empty = true;
for (Object ob : arr) {
  if (ob != null) {
    empty = false;
    break;
  }
}

1
UPS、最後のスニペットがありobj !- null、おそらくあることを意味し、obj != null
user85421

5
忘れないでください:org.apache.commons.lang3.ArrayUtils.isEmpty(k)
aholub7x

===は機能しないことに注意してください。nullはタイプが異なるため、==を使用する必要があります。
Elijah Mock


20

その長さを見てください:

int[] i = ...;
if (i.length == 0) { } // no elements in the array

同時にnullをチェックする方が安全ですが:

if (i == null || i.length == 0) { }

1
nullと長さ0の両方をチェックする必要がある場合、起こり得るnullポインターエラーを回避するために、最初にnullをチェックすることが重要です
Bill Milagro

6

nullまたは空の配列をチェックするメソッドもorg.apache.commons.langにあります:

import org.apache.commons.lang.ArrayUtils;

ArrayUtils.isEmpty(array);

5

私は.netの出身です。ただし、java / c#は同じです。

非プリミティブ型(この場合は配列)をインスタンス化する場合、nullにはなりません。
たとえばint[] numbers = new int[3];
、この場合、スペースが割り当てられ、各要素のデフォルト値は0です。

nullあなたがそれをしなければ、それはになりますnew
例えば

int[] numbers = null; // changed as per @Joachim's suggestion.
if (numbers == null)
{
   System.out.println("yes, it is null. Please new it up");
}

1
numbersまだ初期化されていないことを通知するため、Javaではコンパイルできません。「初期化されnullていません」と同じものではありません。
Joachim Sauer、

ヨアヒムに感謝します。にint[] numbers変更するように投稿を編集しint[] numbers == nullます。C#では、そうではありません。
shahkalpesh

2

int配列はゼロで初期化されるため、実際にnullが含まれることはありません。Objectの配列のみが最初にnullを含みます。


nullの整数をチェックする必要がある場合
Ankit Sachan

1
intなどのプリミティブを使用してnullをチェックすることはできません。
オブジェクト

2
宣言した場所によって異なりますが、クラスメンバーとしては、ゼロで初期化されます。しかし、メソッド内でローカルに宣言されている場合、それは別のケースだと思います...初期値を自分で割り当てる必要があります。私は考えます。ちょっとした考え!
ultrajohn

2

ここでのポイントは、変数kが配列を指すため、変数kがnullではないということです。配列自体が空であってもかまいません。投稿のnullテストは、変数kが何も指していない場合にのみtrueと評価されます。


2

以下のようにテストしました。それが役に立てば幸い。

Integer[] integers1 = new Integer[10];
        System.out.println(integers1.length); //it has length 10 but it is empty. It is not null array
        for (Integer integer : integers1) {
            System.out.println(integer); //prints all 0s
        }

//But if I manually add 0 to any index, now even though array has all 0s elements
//still it is not empty
//        integers1[2] = 0;
        for (Integer integer : integers1) {
            System.out.println(integer); //Still it prints all 0s but it is not empty
            //but that manually added 0 is different
        }

//Even we manually add 0, still we need to treat it as null. This is semantic logic.

        Integer[] integers2 = new Integer[20];
        integers2 = null; //array is nullified
//        integers2[3] = null; //If I had int[] -- because it is priitive -- then I can't write this line. 
        if (integers2 == null) {
            System.out.println("null Array");
        }   

0

int要素なしアレイは必ずしもありませんnull。それはnullまだ割り当てられていない場合のみになります。Java配列の詳細については、このチュートリアルを参照してください。

配列の長さをテストできます:

void foo(int[] data)
{
  if(data.length == 0)
    return;
}

0
    public boolean empty() {
    boolean isEmpty = true;
    int i = 0;
    for (int j = 0; j < array.length; j++) {
        if (array[j] != 0) {
            i++;
        }
    }
    if (i != 0) {
        isEmpty = false;
    }
    return isEmpty;
}

これは、int配列が空かどうかを確認するのと同じくらい近いです。ただし、配列内の整数が実際にゼロの場合は機能しません。{1,2,3}で機能し、{2,0}の場合は引き続きfalseを返しますが、{0}はtrueを返します


0

Java 8以降では、ストリームallMatchメソッドを使用してこれを実現します。

プリミティブの場合:

int[] k = new int[3];
Arrays.stream(k).allMatch(element -> element != 0)

オブジェクトの場合:

Objects[] k = new Objects[3];
Arrays.stream(k).allMatch(Objects::nonNull)

-1

あなたが欲しいのは

int[] k = new int[3];

if (k != null) {  // Note, != and not == as above
    System.out.println(k.length);
}

あなたはそれを新しくしたので、nullになることは決してありませんでした。


-1

また、その長さを調べて配列に要素があるかどうかを確認し、それをif-elseステートメントに入れて、nullかどうかを確認することもできます。

int[] k = new int[3];
if(k.length == 0)
{
//do something
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.