Làm thế nào tôi có thể kiểm tra xem một mảng là null / trống?


137

tôi có một int mảng không có phần tử và tôi đang cố kiểm tra xem nó có trống không.

Ví dụ, tại sao điều kiện của câu lệnh if trong đoạn mã dưới đây không bao giờ đúng?

int[] k = new int[3];

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

Bạn có thể gửi thêm một chút mã không? Bit nơi mảng được khởi tạo sẽ hữu ích để xem.
Đánh dấu Giáo hoàng

Tôi không chắc chắn những gì bạn yêu cầu. Thật đáng ngạc nhiên khi kiểm tra xem một mảng có null không, người ta sẽ nói (mảng == null)
Paul

7
Bạn có muốn không nếu (k! = Null)
vickirk

Câu trả lời:


214

Có một sự khác biệt chính giữa một nullmảng và một mảng trống. Đây là một thử nghiệm cho null.

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

"Rỗng" ở đây không có ý nghĩa chính thức. Tôi đang chọn định nghĩa trống là có 0 phần tử:

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

Một định nghĩa khác của "trống" là nếu tất cả các yếu tố là null:

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

hoặc là

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

1
up, đoạn trích cuối cùng obj !- null, có lẽ có nghĩa làobj != null
user85421

5
Đừng quên về: org.apache.commons.lang3.ArrayUtils.isEmpty (k)
aholub7x

Hãy nhớ rằng, === sẽ không hoạt động. Bạn phải sử dụng == vì nullthuộc loại khác.
Elijah Mock

98

ArrayUtils.isNotEmpty(testArrayName)từ gói org.apache.commons.lang3đảm bảo Array không rỗng hoặc trống


20

Nhìn vào chiều dài của nó:

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

Mặc dù an toàn hơn để kiểm tra null cùng một lúc:

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

1
nếu bạn cần kiểm tra cả null và độ dài 0, điều quan trọng là phải kiểm tra null trước như bạn đã làm, để tránh lỗi con trỏ null có thể xảy ra
Bill Milagro

6

Phương pháp kiểm tra mảng cho null hoặc rỗng cũng có mặt trên org.apache.commons.lang:

import org.apache.commons.lang.ArrayUtils;

ArrayUtils.isEmpty(array);

5

Tôi đến từ .net nền. Tuy nhiên, java / c # giống nhau hơn / ít hơn.

Nếu bạn khởi tạo một kiểu không nguyên thủy (mảng trong trường hợp của bạn), nó sẽ không có giá trị.
ví dụ: int[] numbers = new int[3];
Trong trường hợp này, không gian được phân bổ & mỗi phần tử có giá trị mặc định là 0.

Nó sẽ là null, khi bạn không newlên.
ví dụ

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

1
Trong Java sẽ không được biên dịch, bởi vì nó sẽ cho bạn biết rằng numberschưa được khởi tạo. "Uninitialized" và nullkhông giống nhau.
Joachim Sauer

Cảm ơn Joachim. Tôi sẽ chỉnh sửa bài đã int[] numbersthay đổi thành int[] numbers == null; Trong c #, nó không phải là trường hợp.
shahkalpesh

2

Một mảng int được khởi tạo bằng 0 nên nó thực sự sẽ không chứa null. Chỉ các mảng của Object sẽ chứa null ban đầu.


Điều gì xảy ra nếu tôi phải kiểm tra null cho số nguyên
Ankit Sachan

1
Bạn không thể kiểm tra null với các nguyên hàm như int.
các đối tượng

2
phụ thuộc vào nơi bạn đã khai báo nó, nếu là một thành viên trong lớp, thì có, nó sẽ được khởi tạo với số không. nhưng khi được khai báo cục bộ bên trong một phương thức, tôi tin đó là trường hợp khác ... bạn phải tự gán một giá trị ban đầu. tôi giả sử. chỉ là một ý nghĩ!
ultrajohn

2

Điểm ở đây rất đơn giản là biến k không null vì nó trỏ đến mảng. Nó không quan trọng rằng bản thân mảng trống. Kiểm tra null trong bài đăng của bạn sẽ chỉ đánh giá là đúng nếu biến k không trỏ đến bất cứ điều gì.


2

Tôi đã thử nghiệm như dưới đây. Hy vọng nó giúp.

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

Một intmảng không có phần tử là không cần thiết null. Nó sẽ chỉ là nullnếu nó chưa được phân bổ. Xem hướng dẫn này để biết thêm thông tin về mảng Java.

Bạn có thể kiểm tra độ dài của mảng:

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;
}

Điều này gần giống như tôi phải kiểm tra xem một mảng int có trống không. Mặc dù điều này sẽ không hoạt động khi số nguyên trong mảng thực sự bằng không. Nó sẽ hoạt động cho {1,2,3} và nó vẫn trả về false nếu {2,0} nhưng {0} sẽ trả về true


0

Trong Java 8+, bạn đạt được điều này với sự trợ giúp của phương thức stream allMatch.

Đối với nguyên thủy:

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

Đối với đối tượng:

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

-1

Tôi tin rằng những gì bạn muốn là

int[] k = new int[3];

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

Bạn đã làm mới nó để nó sẽ không bao giờ là null.


-1

Bạn cũng có thể kiểm tra xem có bất kỳ phần tử nào trong mảng hay không bằng cách tìm ra độ dài của nó, sau đó đặt nó vào câu lệnh if-other để kiểm tra xem nó có null không.

int[] k = new int[3];
if(k.length == 0)
{
//do something
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.