循环体内,Scanner定义的参数sc,加上sc.close();语句执行时报错

循环体内,Scanner定义的参数sc,加上sc.close();语句执行时报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.Scanner;
 
public class GuessDemo {
 
    public static void main(String[] args) {
        System.out.print("猜一个介于1到10之间的数字:");
        int number=(int)(Math.random()*10+1);
        int guess;
        do {
            Scanner sc=new Scanner(System.in);
            guess=sc.nextInt();
            sc.close();
            System.out.println("guess="+guess);
            if(guess<number) {
                System.out.print("太小,请重新输入:");
            }else if(guess>number){
                System.out.print("太大,请重新输入:");
            }
        }while(number!=guess);
        System.out.println("恭喜您,您猜对了!");
    }
 
}

为什么在循环体加上sc.close();在执行的时候为什么会报错?(去除sc.close();正常执行)

报错信息如下:

猜一个介于1到10之间的数字:1

guess=1

太小,请重新输入:Exception in thread "main" java.util.NoSuchElementException

at java.util.Scanner.throwFor(Scanner.java:862)

at java.util.Scanner.next(Scanner.java:1485)

at java.util.Scanner.nextInt(Scanner.java:2117)

at java.util.Scanner.nextInt(Scanner.java:2076)

at com.imooc.part5.GuessDemo.main(GuessDemo.java:13)

正在回答

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

1回答

同学你好,sc.close()表示将Scanner对象关闭了,再次使用时就会报这个错误。这里建议将Scanner对象定义在循环外,避免重复创建,sc.close()写在最后。

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 飞越罗格镇 提问者 #1
    老师你好,是不是可以这么理解,sc在被close了以后,在整个程序周期就不能再被使用了,需要重新定义一个sc2?
    2020-02-02 22:54:43
  • 好帮手慕阿满 回复 提问者 飞越罗格镇 #2
    当sc被close后,不能再使用,如果再次使用,需要重新定义一个Scanner对象。通常在一个类中,我们只定义一个Scanner对象,程序结束时关闭Scanner对象。祝:学习愉快~
    2020-02-03 09:38:09
  • 飞越罗格镇 提问者 回复 好帮手慕阿满 #3
    了解了,谢谢老师
    2020-02-03 09:38:45
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

帮助反馈 APP下载

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

公众号

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

在线咨询

领取优惠

免费试听

领取大纲

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