关于调用List,contains()方法,报空指针异常的问题。

来源:6-5 应用 Collections.sort() 实现 List 排序

l_yanlei

2016-02-22 00:12

package imooc_java_3_6_1To8;

import java.util.Collections;
import java.util.List;
import java.util.Random;

/**
 * 实现功能:
 * 1.创建List<String>,并且往其中添加10条随机字符串
 * 2.每条字符串长度为10以内的随机整数
 * 3.每条字符串的每个字符都为随机生成的字符,字符可以重复
 * 4.每条随机字符串不可以重复
 */
public class CollectionsTest {
//	1.创建List<String>对象stringList,并且往其中添加10条随机字符串
	List<String> stringList;
	
	public void testStringSort(){
		//创建一个Random对象,用于生成随机数
		Random random = new Random();
		//定义一个字符串,存储所有可能出现的字符
		String base = new String("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
		//控制循环10次
		for(int i = 0; i < 10; i++){
			//得到一个10以内的随机整数,作为循环的次数,控制字符串的长度,数字可以重复
			//循环得到一个随机字符(数字or字母【大写/小写】),把字符组合成一个字符串
			int stringSize = random.nextInt(10);
			//定义一个StringBuffer对象,存储随机字符串(因为StringBuffer可以变换其内容,所以比较好)
			StringBuffer sb = new StringBuffer();
			for(int j = 0; j < stringSize; j++){
				//随机获得base字符串的一个字符的下标
				int index = random.nextInt(base.length());
				//把对应下标的字符添加到StringBuffer对象sb中
				sb.append(base.charAt(index));
				}//for循环结束,得到一条随机的字符串
			
			//判断List中是否有该字符串,若无,则添加到list中,若有,则重新循环得到一个新的字符串
			if(stringList.contains(sb))
				continue;
			else{
				//将StringBuffer类型转换成String类型并添加到List中
				String randomString = sb.toString();
				stringList.add(randomString);
				System.out.println("添加了字符串:" + randomString);
			}
			//10次循环结束,输出此时的stringList
			System.out.println("---------------添加前----------------");
			for (String string : stringList) {
				System.out.println("元素:" + string);
			}
			//调用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();
	}

}

运行结果:

http://img.mukewang.com/56c9dfb6000161d307890075.jpg

对应的异常代码(38行):

if(stringList.contains(sb))
    continue;


我在这之前调试过,sb是有内容的,内容是一串随机的字符串。

然后我查看了一下contains的API,如下:

http://img.mukewang.com/56c9e0930001b96e10850299.jpg

这里头也提到了空指针异常。

我怀疑会报错,是因为List对象stringList中没有内容,也就是满足后半句“此列表不允许null元素”。然而这里写着“可选”,我想知道这个“可选”是什么意思,可以让stringList在包含null元素的情况下,调用contains()方法不会报错?那要怎么实现呢?

另外,也想请教大家,API中说的,指定的元素是什么意思呢?是我传入做比较的这个元素,还是List中已有的元素呢?

写回答 关注

3回答

  • 半成品LY
    2016-02-25 22:48:30

    刻苦专研,佩服!

  • l_yanlei
    2016-02-22 00:50:04

    传上一份改好的代码- -

    package imooc_java_3_6_1To8;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.Random;
    
    /**
     * 实现功能:
     * 1.创建List<String>,并且往其中添加10条随机字符串
     * 2.每条字符串长度为10以内的随机整数
     * 3.每条字符串的每个字符都为随机生成的字符,字符可以重复
     * 4.每条随机字符串不可以重复
     */
    public class CollectionsTest {
    //	1.创建List<String>对象stringList,并且往其中添加10条随机字符串
    	List<String> stringList = new ArrayList<String>();
    	
    	public void testStringSort(){
    		//创建一个Random对象,用于生成随机数
    		Random random = new Random();
    		//定义一个字符串,存储所有可能出现的字符
    		String base = new String("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
    		//控制循环10次
    		for(int i = 0; i < 10; i++){
    			//得到一个10以内的随机整数,作为循环的次数,控制字符串的长度,数字可以重复
    			//循环得到一个随机字符(数字or字母【大写/小写】),把字符组合成一个字符串
    			int stringSize;
    			
    			//保证字符串至少包含一个字符
    			do{
    				stringSize = random.nextInt(10);
    			}while(stringSize <= 0);
    			//定义一个StringBuffer对象,存储随机字符串(因为StringBuffer可以变换其内容,所以比较好)
    			StringBuffer sb = new StringBuffer();
    			String randomString;
    			for(int j = 0; j < stringSize; j++){
    				//随机获得base字符串的一个字符的下标
    				int index = random.nextInt(base.length());
    				//把对应下标的字符添加到StringBuffer对象sb中
    				sb.append(base.charAt(index));
    				}//for循环结束,得到一条随机的字符串
    			//判断List中是否有该字符串,若无,则添加到list中,若有,则重新循环得到一个新的字符串
    			/**
    			 * 以下注释部分会报空指针异常,估计是contains的原因。未知。
    			 * 补充:开始的时候List<String> stringList ;
    			 * 并没有初始化
    			 * 加上List<String> stringList = new ArrayList<String>();即解决问题;
    			 */
    			if(stringList.contains(sb))
    				continue;
    			else{
    				//将StringBuffer类型转换成String类型并添加到List中
    				randomString = sb.toString();
    				stringList.add(randomString);
    				System.out.println("添加了字符串:" + randomString);
    			}
    			
    		}
    		//10次循环结束,输出此时的stringList
    		System.out.println("---------------排序前----------------");
    		for (String string : stringList) {
    			System.out.println("元素:" + string);
    		}
    		//调用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();
    	}
    
    }


    l_yanl...

    自问自答- -好无聊。。。话说怎么删除自己的提问?

    2016-02-22 00:50:32

    共 1 条回复 >

  • l_yanlei
    2016-02-22 00:44:00

    好吧,我又对比了一下老师做对String类型的List排序的代码。发现在创建List<String> stringList时没有将它实例化为ArrayList<String>();加上这部分语句,也就是:

    List<String> stringList = new ArrayList<String>();

    代码就能正常运行了。傻了,忘记实例化对象了- -

    不过关于contains的API中的空指针异常,还是求指教,不是很懂什么意思。

    sysyte...

    我实例化对象了了 为什么还是报错

    2017-01-18 11:12:02

    共 2 条回复 >

Java入门第三季

Java中你必须懂得常用技能,不容错过的精彩,快来加入吧

409767 学习 · 4530 问题

查看课程

相似问题