關(guān)于調(diào)用List,contains()方法,報空指針異常的問題。
package?imooc_java_3_6_1To8; import?java.util.Collections; import?java.util.List; import?java.util.Random; /** ?*?實現(xiàn)功能: ?*?1.創(chuàng)建List<String>,并且往其中添加10條隨機(jī)字符串 ?*?2.每條字符串長度為10以內(nèi)的隨機(jī)整數(shù) ?*?3.每條字符串的每個字符都為隨機(jī)生成的字符,字符可以重復(fù) ?*?4.每條隨機(jī)字符串不可以重復(fù) ?*/ public?class?CollectionsTest?{ // 1.創(chuàng)建List<String>對象stringList,并且往其中添加10條隨機(jī)字符串 List<String>?stringList; public?void?testStringSort(){ //創(chuàng)建一個Random對象,用于生成隨機(jī)數(shù) Random?random?=?new?Random(); //定義一個字符串,存儲所有可能出現(xiàn)的字符 String?base?=?new?String("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); //控制循環(huán)10次 for(int?i?=?0;?i?<?10;?i++){ //得到一個10以內(nèi)的隨機(jī)整數(shù),作為循環(huán)的次數(shù),控制字符串的長度,數(shù)字可以重復(fù) //循環(huán)得到一個隨機(jī)字符(數(shù)字or字母【大寫/小寫】),把字符組合成一個字符串 int?stringSize?=?random.nextInt(10); //定義一個StringBuffer對象,存儲隨機(jī)字符串(因為StringBuffer可以變換其內(nèi)容,所以比較好) StringBuffer?sb?=?new?StringBuffer(); for(int?j?=?0;?j?<?stringSize;?j++){ //隨機(jī)獲得base字符串的一個字符的下標(biāo) int?index?=?random.nextInt(base.length()); //把對應(yīng)下標(biāo)的字符添加到StringBuffer對象sb中 sb.append(base.charAt(index)); }//for循環(huán)結(jié)束,得到一條隨機(jī)的字符串 //判斷List中是否有該字符串,若無,則添加到list中,若有,則重新循環(huán)得到一個新的字符串 if(stringList.contains(sb)) continue; else{ //將StringBuffer類型轉(zhuǎn)換成String類型并添加到List中 String?randomString?=?sb.toString(); stringList.add(randomString); System.out.println("添加了字符串:"?+?randomString); } //10次循環(huán)結(jié)束,輸出此時的stringList System.out.println("---------------添加前----------------"); for?(String?string?:?stringList)?{ System.out.println("元素:"?+?string); } //調(diào)用Collections.sort()方法對stringList排序,并輸出排序后的stringList Collections.sort(stringList); System.out.println("---------------添加前----------------"); for?(String?string?:?stringList)?{ System.out.println("元素:"?+?string); } } } public?static?void?main(String[]?args)?{ CollectionsTest?ct?=?new?CollectionsTest(); ct.testStringSort(); } }
運行結(jié)果:
對應(yīng)的異常代碼(38行):
if(stringList.contains(sb)) ????continue;
我在這之前調(diào)試過,sb是有內(nèi)容的,內(nèi)容是一串隨機(jī)的字符串。
然后我查看了一下contains的API,如下:
這里頭也提到了空指針異常。
我懷疑會報錯,是因為List對象stringList中沒有內(nèi)容,也就是滿足后半句“此列表不允許null元素”。然而這里寫著“可選”,我想知道這個“可選”是什么意思,可以讓stringList在包含null元素的情況下,調(diào)用contains()方法不會報錯?那要怎么實現(xiàn)呢?
另外,也想請教大家,API中說的,指定的元素是什么意思呢?是我傳入做比較的這個元素,還是List中已有的元素呢?
2016-02-25
刻苦專研,佩服!
2016-02-22
傳上一份改好的代碼- -
2016-02-22
好吧,我又對比了一下老師做對String類型的List排序的代碼。發(fā)現(xiàn)在創(chuàng)建List<String> stringList時沒有將它實例化為ArrayList<String>();加上這部分語句,也就是:
List<String> stringList = new ArrayList<String>();
代碼就能正常運行了。傻了,忘記實例化對象了- -
不過關(guān)于contains的API中的空指針異常,還是求指教,不是很懂什么意思。