关于Scanner在try-catch中的异常

public static void main(String[] args) {

        Scanner scanner=new Scanner(System.in);
        int i=0;
        while (true){
            System.out.println("请输入一个整数:");
            try {
                i=scanner.nextInt();
            }catch (Exception e){
                System.out.println("你应该输入一个整数");
            }

        }
    }

在上面的语句中,当我们输入一个字符的时候它会循环打印“请输入一个整数:”和“你应该输入一个整数”。造成这样的原因是因为我们用sc.nextInt()调用没把该段内存中的东西提出来,他就会一直占用这段内存,导致我们二次输入时,就不会再要求用户输入了,他会继续试图调用该段内存数值。解决办法:可以把该段内存中的数值取出。在catch语句块中使用scanner.next();
代码如下:

public static void main(String[] args) {

        Scanner scanner=new Scanner(System.in);
        int i=0;
        while (true){
            System.out.println("请输入一个整数:");
            try {
                i=scanner.nextInt();
            }catch (Exception e){
				scanner.next();
                System.out.println("你应该输入一个整数");
            }

        }
    }

还有就是当你有多个Scanner对象时,如果调用了Scanner的close()的话它会将所有的Scanner对象都关闭。如下:

public class Test1 {

    Scanner scanner=new Scanner(System.in);

    public void f(){
        scanner.close();
    }
}
public class Test2 {

    public static void main(String[] args) {

        Scanner scanner=new Scanner(System.in);
        Test1 test1=new Test1();
        test1.f();
        System.out.println("请输入你的姓名:");
        //将会抛出异常,就算你是在另一个类中关闭的Scanner
        //它会提示你:NoSuchElementException(没有这样的元素)
        //就算重新new一个Scanner对象也无济于事
        String name=scanner.next();

    }

}

可以验证上面的结论:
在test2中我们将test1中f()的调用注释掉换成scanner.close(),就会发现系统抛出的异常和上面一样
这是因为System.in的这个流被关闭了,这个流只有一个,这也是为什么在Test1中代用close方法而test2中也不能用了。

public class Test2 {

    public static void main(String[] args) {

        Scanner scanner=new Scanner(System.in);
//        Test1 test1=new Test1();
//        test1.f();
        scanner.close();
        System.out.println("请输入你的姓名:");
        //将会抛出异常,就算你是在另一个类中关闭的Scanner
        //它会提示你:NoSuchElementException(没有这样的元素)
        //就算重新new一个Scanner对象也无济于事
        String name=scanner.next();

    }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值