2010-03-03 33 views
69

Tôi có mảng int không có phần tử và tôi đang cố kiểm tra xem nó có trống không.Làm thế nào tôi có thể kiểm tra xem một mảng là null/empty?

Ví dụ: tại sao câu lệnh if trong mã bên dưới không bao giờ đúng?

int[] k = new int[3]; 

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

Bạn có thể đăng thêm một chút mã không? Bit nơi mảng được khởi tạo sẽ hữu ích để xem. –

+0

Tôi không chắc chắn yêu cầu của bạn. Surelly để kiểm tra nếu một mảng là null một sẽ nói (array == null) – Paul

+6

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

Trả lời

152

Có sự khác biệt chính giữa mảng null 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"); 
} 

"Trống rỗng" ở đây không có ý nghĩa chính thức. Tôi đang lựa chọn để xác định sản phẩm nào là có 0 yếu 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 rỗng" là nếu tất cả các yếu tố này 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

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

up, đoạn cuối có 'obj! - null', có thể có nghĩa là' obj! = null' –

+2

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

0

Một int mảng không có phần tử không nhất thiết phải là null. Nó sẽ chỉ là null nếu chưa được phân bổ. Xem this tutorial để biết thêm thông tin về các mảng Java.

Bạn có thể kiểm tra của mảng chiều dài:

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

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

Nếu bạn khởi tạo loại không nguyên thủy (mảng trong trường hợp của bạn), nó sẽ không rỗng.
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.

Sẽ null, khi bạn không new nó lê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 biên dịch, bởi vì nó sẽ cho bạn biết rằng 'số' chưa được khởi tạo. "Uninitialized" và 'null' không giống nhau. –

+0

Cảm ơn Joachim. Tôi sẽ chỉnh sửa bài viết để có 'int [] số' thay đổi thành' int [] number == null'; Trong C#, nó không phải là trường hợp. – shahkalpesh

14

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ù nó an toàn hơn để kiểm tra null cùng một lúc:

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

Một mảng int được khởi tạo với zero nên nó sẽ không thực sự bao giờ chứa null. Chỉ mảng của đối tượng sẽ chứa null ban đầu.

+0

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

+1

Bạn không thể kiểm tra null bằng các số nguyên thủy như int. – objects

+2

tùy thuộc vào nơi bạn khai báo, nếu là thành viên của nhóm, thì có, nó đượ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 pháp, tôi tin rằng đó là một trường hợp khác ... bạn phải gán giá trị ban đầu cho mình. tôi giả sử. chỉ là một ý nghĩ! – ultrajohn

-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 newed nó lên để nó sẽ không bao giờ được null.

29

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

+0

Đây thực sự là những gì tôi đang tìm kiếm –

0

Vấn đề ở đây rất đơn giản là biến k là bắt buộc vì nó trỏ tới mảng. Không quan trọng là bản thân mảng trống. Các thử nghiệm null trong bài viết của bạn sẽ chỉ đánh giá đúng nếu biến k không trỏ đến bất cứ điều gì.

1

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

Bạn cũng có thể kiểm tra xem có bất kỳ yếu tố trong mảng bằng cách tìm hiểu chiều dài của nó, sau đó đặt nó vào lệnh if-else để kiểm tra xem nó là null.

int[] k = new int[3]; 
if(k.length == 0) 
{ 
//do something 
} 
Các vấn đề liên quan