为什么没有赋值,sc.next()就接受了非整型数据,而且循环也没有在继续进行下去,能解释的再详细一点吗
public int[] insterData() {
int[] a = new int[10];
Scanner sc = new Scanner(System.in);
for(int i = 0;i<a.length-1;i++) {
System.out.println("输入第"+(i+1)+"个数据");
try {
a[i]=sc.nextInt();
}catch(java.util.InputMismatchException e) {
System.out.println("输入的格式有误");
sc.next();
i--;
}
}
return a;
}
正在回答 回答被采纳积分+1
同学你好,这个知识点会在异常的章节做细致的介绍。这里老师讲代码运行的流程解析一下:
1.当调用insterData方法后,执行for循环时,会先初始化循环控制变量i,此时i的值为0;
2.接下来会执行for循环的控制条件语句,也就是判断i < a.length - 1的结果是否为true;
3.当结果为true时,此时会先进入循环体,执行大括号中的代码,输出打印语句的内容之后,进入try的代码块中;
接下来由于接收用户输入的数据,要分为是否输入正确数据的情况:
数据正确:
4.1如果此时输入的是符合规范的数据,也就是整数类型时,代码没有发生任何异常(后面课程会介绍,也就是我们现在所说的报错),此时不会执行catch中的代码;
4.2那么此时的for循环的循环体中代码运行结束,接下来执行循环控制变量的变化代码,即i++;
4.3之后进入下次循环;
数据错误
5.1如果此时输入的是不符合规范的数据,也就是非整数类型时,代码会发生异常,此时立刻中止代码向下运行的动作,立即进入catch代码块;
5.2由于上一步中是立即中止的,此时的非法数据还没经过任何处理,所以如果进入下一次循环,这个数据还会到达代码中的nextInt方法,还会继续引发同样的错误,如此周而复始就没有尽头了,所以此处sc.next();语句,将这个错误的数据进行接收处理,避免影响下一次的数据接收。
5.3当上一步结束之后,如果此时没有其他代码,此时应该执行循环控制变量的变化代码,即i++,但是这次并没有正确的完成数据接收,所以我们应当保证下一次循环时,做上次未完成的事,所以要在i++执行之前,先对i进行i--的操作,这样下一次进入循环时,i的值和出错这次就是一样的了。
5.4上一步老师更建议同学使用continue关键字来处理,即不使用i--而是使用continue,这样无论是代码的可读性还是避免出现意外情况,都是更加优化的写法;
5.5当上面的代码执行结束后,进入下一次循环。
以上就是代码在出错与没错时代码的执行流程,同学如果有疑问可以继续提问。
祝学习愉快~
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星