Java不定參數(shù)使用及一些注意情況
一、背景
在項目中使用到了StringUtils.isAllBlack(String …css)方法??梢院芊奖愕貍鬟f不定數(shù)量的參數(shù)進行空判。
但開發(fā)過程中遇到了一些問題,所以特地記錄一下。
二、不定參數(shù)傳參
不定參數(shù)的傳參本質上是一個泛型的數(shù)組。參數(shù)數(shù)量大于等于兩個的時候,系統(tǒng)會把傳入的參數(shù)都放到一個對應類型的數(shù)組里面。
但傳單個參數(shù)的時候存在一些需要注意的情況,不注意可能會出現(xiàn)空指針異常。
2.1、通過引用傳單個null
public class Test {
public static void test1(Object... css) {
System.out.println(css);
for (Object o : css) {
System.out.println(o);//null
}
}
public static void main(String[] args) {
String s=null;
test1(s);
}
}
上述代碼運行結果是輸出:null
程序把傳入的null當成一個元素放到了參數(shù)數(shù)組里面。

2.2、直接傳單個null
public class Test {
public static void test1(Object... css) {
System.out.println(css);//null
for (Object o : css) {//NullPointException
System.out.println(o);
}
}
public static void main(String[] args) {
test1(null);
}
}
上述代碼并沒有把直接傳的null當成參數(shù)數(shù)組的一個元素,而是直接讓參數(shù)數(shù)組為null。因為沒有明確告訴程序這個null是什么類型的,系統(tǒng)直接把null的類型轉換成不定參數(shù)對應的Object[]類型。因此css為空。

2.3、驗證直接傳null的默認效果
public class Test {
public static void test1(Object... css) {
System.out.println(css);
for (Object o : css) {
System.out.println(o);
}
}
public static void main(String[] args) {
test1((Object[]) null);
}
}
上述代碼的運行結果和直接傳單個null一樣,符合預期。

2.4、直接傳單個null(加類型強轉)
public class Test {
public static void test1(Object... css) {
System.out.println(css);
for (Object o : css) {
System.out.println(o);
}
}
public static void main(String[] args) {
test1((Object) null);
}
}
上述代碼,因為強轉告訴系統(tǒng)參數(shù)的數(shù)據(jù)類型,系統(tǒng)又把null當成了參數(shù)數(shù)組里面的一個元素來處理。這里的類型強轉和2.1、的傳參方式本質上是一樣的。

2.5、注意
直接傳單個null的時候效果相當于傳(T[]) null,css會為空。
三、StringUtils.isAnyBlank(String …css)注釋
StringUtils.isAnyBlank((String) null) = true
StringUtils.isAnyBlank((String[]) null) = false
StringUtils.isAnyBlank(null, "foo") = true
StringUtils.isAnyBlank(null, null) = true
StringUtils.isAnyBlank("", "bar") = true
StringUtils.isAnyBlank("bob", "") = true
StringUtils.isAnyBlank(" bob ", null) = true
StringUtils.isAnyBlank(" ", "bar") = true
StringUtils.isAnyBlank(new String[] {}) = false
StringUtils.isAnyBlank(new String[]{""}) = true
StringUtils.isAnyBlank("foo", "bar") = false
一個一個解釋上面的調用方式,在org.apache.commons.lang3.StringUtils中。
首先,這個方法是用來判斷傳入的參數(shù)是否存在為空或空串。
第一個,相當于傳入了一個null放在參數(shù)數(shù)組里面,有一個元素,并且為null,因此為真。
第二個,默認類型為String[],相當于css為空,也就是參數(shù)數(shù)組為空,相當于沒有傳入元素,沒有傳入?yún)?shù)也就不會有參數(shù)為空,因此為假。和StringUtils.isAnyBlank(null)效果一樣第三個,傳入了兩個參數(shù),第一個為null,因此為真。
第四個,傳入兩個null,多個參數(shù)情況下,默認類型是String,兩個null,因此為真。
第五個,第一個參數(shù)傳入空串,因此為真。
第六個,第二個參數(shù)傳入空串,因此為真。
第七個,第二個參數(shù)傳入null,因此為真。
第八個,第一個參數(shù)傳入空格,空格也在black的判斷里面,因此為真。
第九個,傳入一個容量為0的空字符串數(shù)組,因為里面沒有元素,也就沒有元素為空或空串,因此為假。
第十個,傳入一個數(shù)組,里面有一個空串,因此為真。
第十一個,傳入兩個字符串,都不為空或空串,因此為假。
再加一種情況,傳入一個容量不為0的空字符串數(shù)組,因為數(shù)組里面默認填充null,因此為真。
重點需要考慮的就是不同查找時候,對于參數(shù)數(shù)組為null的情況的處理。
總的來說可以這樣理解:存在xxx,就看元素是否存在xxx,存在就為真,不存在就為假(參數(shù)數(shù)組都為null的情況當然是不存在)。全部xxx,就查詢元素是否存在反xxx,存在就為假,不存在就為真(參數(shù)數(shù)組都為null的情況當然是不存在)。也正是因為如此,存在和全部這兩種判斷在遇到參數(shù)數(shù)組為空的時候判斷結果才完全相反。
到此這篇關于Java不定參數(shù)使用及一些注意情況的文章就介紹到這了,更多相關Java不定參數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java SpringMVC 異常處理SimpleMappingExceptionResolver類詳解
這篇文章主要介紹了SpringMVC 異常處理SimpleMappingExceptionResolver類詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-09-09
Java中SimpleDateFormat日期格式轉換詳解及代碼示例
這篇文章主要介紹了Java中SimpleDateFormat日期格式轉換詳解及代碼示例,具有一定借鑒價值,需要的朋友可以參考下。2017-12-12
詳解@ConfigurationProperties實現(xiàn)原理與實戰(zhàn)
這篇文章主要介紹了詳解@ConfigurationProperties實現(xiàn)原理與實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10

