老师,关于scanner.next()提问

老师,关于scanner.next()提问

代码如下:

public float[] initScore(Scanner scanner) {
    int n = 0;
    while (n < 1) {
        System.out.println("请输入要存储的数学成绩的数量:");
        try {
            n = scanner.nextInt();
            if (n < 1) {
                System.out.println("数量最少为1,请重新输入!");
                scanner.next();
            }
        } catch (InputMismatchException e) {
            System.out.println("您输入的不是整数,请重新输入!");
            scanner.next();
        }
    }
    float[] scores = new float[n];
    for (int i = 0; i < n; i++) {
        System.out.println("请输入第" + (i + 1) + "个数据:");
        try {
            scores[i] = (float) scanner.nextDouble();
            if (scores[i] < 0) {
                System.out.println("成绩不能小于0,请重新输入!");
                i--;
            }
        } catch (InputMismatchException e) {
            System.out.println("您输入的不是数字,请重新输入!");
            scanner.next();
            i--;
        }
    }
    return scores;
}

老师可以看一下截图里面的两个scanner.next(),为什么catch模块的scanner.next()可以接收到数据,而if模块的不行,这是我的一个疑问点。辛苦老师解疑答惑。https://img1.sycdn.imooc.com//climg/63afa47c093f509705270646.jpg

再描述下现象,就是如果执行catch模块会有数据直接填充scanner.next(),如果执行if模块的就不会有数据自动填充scanner.next();导致每次执行if模块需要手动输入个内容,删除掉该代码就会是自动执行流程了;我的理解是两个模块的流程基本上是一样的,为什么catch必须加入next()才能正常执行而if模块加入后反而影响程序的自动执行。

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
SocksRobot 提问者 2022-12-31 11:15:32

看了一下其他同学的提问,大概知道是为什么了,我解释一下老师可以看看理解的是否正确。

  1. 关于catch里面的调用next()目的是为了接收scanner中存储的那个无法被正常转化为int类型的字符串,接收后scanner保存的那个字符串就会被销毁才可以进行下个数据的正常接收,所以调用next()是为了清空scanner接收的数据。

  2. 关于if模块里面的next(),因为nextInt()已经将接收到的字符串转化为int数据,已经达到了销毁清空scanner接收的数据,如果再调用next(),程序就会等待你再输入一个字符串内容,只有输入了才能继续执行。

  • 同学你好,可以这么理解。nextInt()接收数据如果格式正确,可以正常转换,那么转换之后将原来的字符串销毁,将转换后的数据存储在代码的变量中;若再次调用next(),程序就会等待再输入字符串内容,只有输入了才能继续执行。

    祝学习愉快~

    2023-01-02 10:44:51
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
微信客服

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

帮助反馈 APP下载

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

公众号

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

在线咨询

领取优惠

免费试听

领取大纲

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