为什么没有赋值,sc.next()就接受了非整型数据,而且循环也没有在继续进行下去,能解释的再详细一点吗

为什么没有赋值,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回答
好帮手慕小蓝 2021-11-14 13:21:31

    同学你好,这个知识点会在异常的章节做细致的介绍。这里老师讲代码运行的流程解析一下:

    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当上面的代码执行结束后,进入下一次循环。

以上就是代码在出错与没错时代码的执行流程,同学如果有疑问可以继续提问。

祝学习愉快~


  • 5.4部分 用continue关键只处理代替i--,是如何操作的?continue不是结束此次循环,进行下一次循环吗?for(i++)中的i++不是还是要执行吗?这个没搞懂,老师解惑下
    下载视频          
    2022-01-20 14:42:43
  • 还有为什么sc.next()不需要赋值就可接受异常非法数据吗?不需要向a[i]=sc.nextInt()这样吗
    下载视频          
    2022-01-20 14:46:16
  • 同学你好~

    1. 这里是老师描述错误,应当是,使用i--后配合continue,即在i--后加continue的写法。给同学带来困扰很抱歉。

    2. next方法虽然有返回值,但是该返回值我们可以选择接收也可以不接收。这里我们只需要使用这个方法对错误的输入信息进行一下处理,至于错误输入的字符是什么,我们并不关心,所以不作接收。

    祝学习愉快~

    2022-01-20 15:24:10
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师