在 Java 中檢查數組是否為 Null 或空
1. 概述
在 Java 中,操作數組是一項常見任務,其中通常涉及檢查數組是否為null
或為空。這對於防止NullPointerException
並確保我們的程式碼在處理陣列資料結構時行為正確至關重要。
在本教程中,我們將探討如何有效地執行這些檢查。
2. 準備範例
我們首先準備一些範例陣列來快速示範如何檢查陣列是否為空或null
:
final static String[] STR_ARRAY = new String[] { "a", "b", "c", "d" };
final static BigDecimal[] EMPTY_ARRAY = new BigDecimal[] {};
final static String[] NULL_ARRAY = null;
如上面的程式碼所示,我們建立了三個陣列:一個包含四個元素的常規String
陣列、一個空BigDecimal
陣列和一個引用 null 的String
陣列null.
接下來,我們將採用不同的方法來檢查這三個陣列是否為null
或為空。
3. 建立檢查方法
在 Java 中,我們可以透過執行兩個簡單的檢查來檢查陣列是否為null
或空:
-
null
檢查 – 使用== null
- 空檢查-檢查陣列的
length
屬性,看看它是否有零個元素
當然,我們希望我們的方法適用於所有數組類型。第一個想法是建立一個通用檢查方法:
static <T> boolean isArrayNullOrEmpty(T[] theArray) {
return theArray == null || theArray.length == 0;
}
我們執行null
和empty 檢查。現在,如果我們將範例陣列傳遞給該方法,它就會達到預期的結果:
assertTrue(isArrayNullOrEmpty(NULL_ARRAY));
assertTrue(isArrayNullOrEmpty(EMPTY_ARRAY));
assertFalse(isArrayNullOrEmpty(STR_ARRAY));
然而,我們還沒有討論一種情況:原始型別數組,例如int[], double[],
等。
接下來,讓我們仔細看看基本類型陣列。
4. 處理原始型別數組
我們先建立一個int[]
數組作為範例:
final static int[] INT_ARRAY = new int[] { 1, 2, 3, 4 };
該數組不為null
或為空。現在,讓我們使用這個陣列來測試我們的通用方法,看看是否可以獲得正確的結果:
assertFalse(isArrayNullOrEmpty(INT_ARRAY));
當我們執行測試時,我們遇到編譯器錯誤:
java: method isArrayNullOrEmpty in class ... cannot be applied to given types;
required: T[]
found: int[]
reason: inference variable T has incompatible bounds
這是因為 Java 泛型是使用「類型擦除」實現的,以實現向後相容性。所有泛型類型都會在運行時轉換為Object
。但是,原始型別並不繼承自Object.
因此,泛型不適用於原始類型。
因此,為了使我們的方法支援所有原始類型數組,我們可以重載該方法並使用相同的實現,但接受不同的原始類型作為參數。
我們以通用的isArrayNullOrEmpty()
方法為例來看看如何實作:
static boolean isArrayNullOrEmpty(int[] theArray) {
return theArray == null || theArray.length == 0;
}
static boolean isArrayNullOrEmpty(short[] theArray) { /* the same implementation */ }
static boolean isArrayNullOrEmpty(long[] theArray) { /* the same implementation */ }
// ... same for float, double, byte, boolean primitive type arrays
現在,如果我們對原始類型數組執行檢查:
assertFalse(isArrayNullOrEmpty(INT_ARRAY));
程式碼編譯並且測試通過。
5.使用ArrayUtils.isEmpty()
方法
Apache Commons Lang 3 是一個廣泛使用的函式庫。它的ArrayUtils
類別提供了一組豐富的實用程序,使數組操作更加容易。該類別提供**isEmpty()
方法來檢查數組是否為null
或空。**
要使用ArrayUtils
類,我們必須先將Apache Commons Lang 3 依賴項加入pom.xml
中:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>
然後,我們可以在程式碼中使用isEmpty()
方法:
assertTrue(ArrayUtils.isEmpty(NULL_ARRAY));
assertTrue(ArrayUtils.isEmpty(EMPTY_ARRAY));
assertFalse(ArrayUtils.isEmpty(STR_ARRAY));
//primitive array
assertFalse(ArrayUtils.isEmpty(INT_ARRAY));
值得注意的是, ArrayUtils
也定義了一組isEmpty()
方法,其中一個以Object[]
作為參數,其餘的接受每個基本類型的參數:
public static boolean isEmpty(final Object[] array)
public static boolean isEmpty(final short[] array)
public static boolean isEmpty(final int[] array)
public static boolean isEmpty(final long[] array)
// ... other primitive types
因此, ArrayUtils.isEmpty()
可以檢查我們的int[]
陣列而不會出現錯誤。
6.使用ObjectUtils.isEmpty()
方法
Apache Commons Lang 3 中的ObjectUtils
旨在優雅地處理null
物件。當我們將陣列傳遞給ObjectUtils.isEmpty()
方法時,它也可以報告陣列是否為null
或為空:
assertTrue(ObjectUtils.isEmpty(NULL_ARRAY));
assertTrue(ObjectUtils.isEmpty(EMPTY_ARRAY));
assertFalse(ObjectUtils.isEmpty(STR_ARRAY));
//primitive array
assertFalse(ObjectUtils.isEmpty(INT_ARRAY));
如測試所示,它適用於物件和原始類型陣列。與ArrayUtils.isEmpty()
不同, ObjectUtils
沒有針對每種基元類型的isEmpty()
方法。相反, isEmpty()
接受一個Object
作為參數並檢查它是否是一個陣列:
public static boolean isEmpty(final Object object) {
if (object == null) {
return true;
}
if (isArray(object)) {
return Array.getLength(object) == 0;
}
// ... unrelated code omitted
return false;
}
public static boolean isArray(final Object object) {
return object != null && object.getClass().isArray();
}
由於primitiveArray.getClass().isArray()
為true
, isEmpty()
適用於原始類型數組。
七、結論
檢查陣列是否為null
或為空是 Java 程式設計中的一項基本任務。在本文中,我們探討如何對物件和基本類型陣列實現這些檢查,創建一個可以在我們的應用程式中重複使用的強大實用方法。此外,我們也示範如何使用方便的ArrayUtils.isEmpty()
和ObjectUtils.isEmpty()
來完成這項工作。
遵循這些實踐,我們可以編寫更乾淨、更安全、更可靠的 Java 程式碼。
與往常一樣,範例的完整原始程式碼可在 GitHub 上取得。