常见异常之 java.util.NoSuchElementException

一 案列引入
  • 自定义学生类:包含姓名,年龄,成绩属性.私有成员变量,生成无参,有参构造方法,生成get/set方法.
  • 创建5个学生放到 ArrayList中.使用迭代器获取每个学生信息.统计总分,平均分,最高分,最低分并输出
  • 采用技术:ArrayList集合 迭代器

二 代码实现
 public static void getMaxAndMinScore(ArrayList<Student> lists){
        //1.非空校验
        if (lists != null && lists.size() > 0) {
            //2.定义遍历存储最大 最小值
            double maxScore = lists.get(0).getScore();
            double minScore = lists.get(0).getScore();
            //3.获取迭代器
            Iterator<Student> it = lists.iterator();
            //4.迭代并进行最大最小值判断
            while (it.hasNext()) {
                if (it.next().getScore() > maxScore) {
                    maxScore = it.next().getScore();
                }
                if (it.next().getScore() < minScore) {
                    minScore = it.next().getScore();
                }
            }
            //5.输出最大最小值
            System.out.println("最高分为:"+maxScore+"/n"+"最低分为:"+minScore);
            return;
        }
        System.out.println("学生信息表无内容");
    }
  • 运行结果:
Exception in thread "main" java.util.NoSuchElementException
	at java.base/java.util.ArrayList$Itr.next(ArrayList.java:999)
	at heima.homework.practice02.StuTest.getMaxAndMinScore(StuTest.java:69)
	at heima.homework.practice02.StuTest.main(StuTest.java:26)
三 异常原因分析:
while (it.hasNext()) {
     if (it.next().getScore() > maxScore) {
         maxScore = it.next().getScore();
     }
     if (it.next().getScore() < minScore) {
         minScore = it.next().getScore();
     }
 }
  • it.hasNext()询问是否有下一个元素,返回true执行语句体,在循环中第一个if中调用了it.next()获取下一个元素然后移位,而第二个if中再次调用it.next()获取下一个元素(相对而言),并移位,相当于一次询问两次移位,而第二次移位并没有询问而直接获取,如果当前位置没有元素值就会出现java.util.NoSuchElementException异常。
四 解决方法
  • 方式一(获取第二个迭代器,分别迭代出最大最小值,但不推荐)
//3.获取迭代器
    Iterator<Student> it = lists.iterator();
     //3.1迭代器2
     Iterator<Student> it2 = lists.iterator();

     //4.迭代并进行最大最小值判断
     while (it.hasNext()) {
         if (it.next().getScore() > maxScore) {
             maxScore = it.next().getScore();
         }
     }
     while (it2.hasNext()){
         if(it2.next().getScore() < minScore){
             minScore = it2.next().getScore();
         }
     }
  • 运行结果:
最高分为:100.0
最低分为:56.0

  • 方式二:先调用it.next()获取出ArrayList集合中的对象再进行最大最小值判断,这样遍历的都是同一个对象,一次询问,一次移位。
// 4.获取迭代器
Iterator<Student> itr = students.iterator();
while (itr.hasNext()) {
	// 9.使用next方法获取学生对象
	Student student = itr.next();

	// 11.判断这个学生的分数是否大于最大分数
	if (maxScore < student.getScore()) {
		// 12.这个学生的分数大于最大分数.最大分数等于这个学生的分数
		maxScore = student.getScore();
	} else if (minScore > student.getScore()) {
		// 13.判断这个学生的分数是否大低最大分数
		// 14.这个学生的分数小于最小分数.最小分数等于这个学生的分数
		minScore = student.getScore();
	}
}
  • 输出结果:
最高分为:100.0
最低分为:56.0


五 总结
  • 在使用迭代器进行取值时应先用it.hasNext()进行询问是否有下一个元素,然后通过it.next()进行取值后并移位,但是切记调用一次就会移位一次,如果进行再次移位没有通过it,hasNext()询问,很可能取不到元素而爆出 java.util.NoSuchElementException异常,如果要对获取出的同一个元素进行操作,可以先用一个变量保存该对象后进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值