Java Scanner.nextxxx() 相关的异常处理

2021/5/31 22:21:11

本文主要是介绍Java Scanner.nextxxx() 相关的异常处理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

所遇到的情况如下

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    int i;
    try {
        System.out.println("请输入一个整数值");
        i = input.nextInt();
        System.out.println("i:" + i);
    } catch (InputMismatchException e) {
        e.printStackTrace();
        System.out.println("输入格式不匹配");
    }
}

上述代码新建一个input引用变量,并将之引用Scanner,try模块中,通过input.nextInt() 获得一个整数值。
对于try模块中,若用户正常通过控制台输入一些整数,那程序将正常运行。但是若用户通过控制台输入了一些非全部为整数的东西,比如sfs1321,那么catch模块将会捕捉到一个InputMismatchException的异常,意思就是说输入的格式与期望的不匹配。

那么,在捕获到InputMismatchException的异常后,Scanner内存保存什么呢?看下述代码:

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    int i;
    try {
        System.out.println("请输入一个整数值");
        i = input.nextInt();
        System.out.println("i:" + i);
    } catch (InputMismatchException e) {
        e.printStackTrace();
        System.out.println("输入格式不匹配");
    } finally {
        System.out.println(input.next());
    }
}

在上述代码中,我在catch后面加了一个finally模块,并在内部通过input.next()输出Scanner内存缓存的东西。
运行效果如下;
在这里插入图片描述
可见,当catch模块捕获到Scanner的输入的InputMismatchException异常后,上一次输入的数据将暂存在Scanner的内存缓存区。

一些小东西:验证格式输入的循环代码

有问题的原代码:

Scanner input = new Scanner(System.in);
int id = 0;
while (true) {
    try {
        System.out.println("请输入ID");
        id = input.nextInt();
        System.out.println("id:" + id);
        break;
    } catch (InputMismatchException e) {
        e.printStackTrace();
        System.out.println("输入格式不匹配");
    }
}

当正常输入整数时,程序正常运行。
当输入不全为整数时,代码将无限循环下去,且从第二次循环开始,每次均跳过try模块。

出现此问题的原因如下:
结合 所遇到的情况 章节中所介绍的东西。Scanner在接收任意输入后,会暂时将数据保存至内存缓存区,然后再通过内存缓存区传给所需要的nextxxx()函数。
在输入一个不全为整数的数据时,由于此数据格式与input.nextInt()所要求的整数格式不同,所以并不会将内存缓存区的数据传给netInt(), 同时catch捕获到InputMismatchException异常,将执行catch模块的代码。在第二次循环时,由于Scanner的内存缓存区依旧存有数据,故直接将内存缓存区的数据传给nextInt(),然后又抛出InputMismatchException的异常,故而无限无限下去。

解决办法:
改动代码如下:

public static void main(String[] args) {
   Scanner input = new Scanner(System.in);
   int id = 0;
   while (true) {
       try {
           System.out.println("请输入ID");
           id = input.nextInt();
           System.out.println("id:" + id);
           break;
       } catch (InputMismatchException e) {
           e.printStackTrace();
           input.next();
           System.out.println("输入格式不匹配");
       }
   }
}

注:

nextInt() next() nextFloat()等方法,在获取Scanner的内存缓存区的数据后,光标将停留在当前行的末尾,并没有将’\n’传给方法。

nextLine()不同于上面的方法,在获取Scanner的内存缓存区的数据后,光标将停留在新行的头部,将上一行的’\n’也传给方法了。

建议:

在进行使用Scanner进行输入时,若前后两次使用不同的方法,比如第一次使用input.nextInt(), 然后第二次使用input.nextFloat()时,建议在两次中间添加input.nextLine()以清空Scanner的内存缓存区。

小白理解,若有误,欢迎探讨。



这篇关于Java Scanner.nextxxx() 相关的异常处理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程