为了账号安全,请及时绑定邮箱和手机立即绑定

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

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://img1.sycdn.imooc.com//56c9dfb6000161d307890075.jpg

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

if(stringList.contains(sb))
    continue;


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

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

http://img1.sycdn.imooc.com//56c9e0930001b96e10850299.jpg

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

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

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

正在回答

3 回答

刻苦专研,佩服!

0 回复 有任何疑惑可以回复我~

传上一份改好的代码- -

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();
	}

}


1 回复 有任何疑惑可以回复我~
#1

l_yanlei 提问者

自问自答- -好无聊。。。话说怎么删除自己的提问?
2016-02-22 回复 有任何疑惑可以回复我~

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

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

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

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

0 回复 有任何疑惑可以回复我~
#1

l_yanlei 提问者

弄懂了- -所谓“指定的元素”指的是传入的元素,也就是Contains(obj)中的obj,如果obj为null,而且List中不允许存在null这个元素时,就会抛出空指针错误。但是默认是允许null这个元素的。如果想实现这个异常,可以手动抛出。大概是这个意思吧。
2016-02-22 回复 有任何疑惑可以回复我~
#2

sysytem

我实例化对象了了 为什么还是报错
2017-01-18 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Java入门第三季
  • 参与学习       409774    人
  • 解答问题       4546    个

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

进入课程

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

我要回答 关注问题
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号