zoukankan      html  css  js  c++  java
  • Scanner循环输出时,无法跳出异常的问题分析

    1.问题场景

    在写Scanner的时候发现一个有意思的问题,代码如下。

      public static void main(String[] args) {
            System.out.println("···游戏开始···");
            Scanner scanner=new Scanner(System.in);
            for(;;){
                try{
                    System.out.println("请输入幸运数字:");
                    int num=scanner.nextInt();
                    System.out.println("您的幸运数字是:"+num);
                    break;
                }catch (Exception e){
                    System.out.println("输入错误,请输入幸运数字:");
                    continue;
                }
            }
            System.out.println("···游戏结束···");
        }

    预期效果:如果输入非数字后,在异常处理的跳出档次循环,继续输入。

    实际效果:输入非数字后,触发死循环,程序不再按照预期执行。

    2.不懂就问

    关于Scanner调用nextInt()异常try后不能二次输入问题博主对于这个问题的解释非常到位。

    Scanner在要求用户输入的时候,其实是在内存中创建了一段空间用于用户输入,我们输入的字母就会存入该段内存。
    如果输入的是非数字,当我们用sc.nextInt()调用时,就不能调用出来,因为它不是我们要调用的int类型,这时就会报输入不匹配错误。
    可是问题就在这儿,我们用sc.nextInt()调用没把该段内存中的东西提出来,他就会一直占用这段内存,导致我们二次输入时,就不会再要求用户输入了,他会继续试图调用该段内存数值。 所以解决办法就是我们清空该段内存,或者把该段内存中的数值取出。
    所以我们在catch块中使用 sc.next(); 就可以解决。

    3.解决方式

    方式一:

    public static void main(String[] args) {
            System.out.println("···游戏开始···");
            Scanner scanner=new Scanner(System.in);
            for(;;){
                try{
                    System.out.println("请输入幸运数字:");
                    int num=scanner.nextInt();
                    System.out.println("您的幸运数字是:"+num);
                    break;
                }catch (Exception e){
                    scanner.next();//查看源码,清缓存
                    System.out.println("输入错误,请输入幸运数字:");
                    continue;
                }
            }
            System.out.println("···游戏结束···");
        }

    方拾二:

    public static void main(String[] args) {
            System.out.println("···游戏开始···");
            Scanner scanner=new Scanner(System.in);
            for(;;){
                try{
                    System.out.println("请输入幸运数字:");
                    int num=Integer.valueOf(scanner.nextLine().trim());
                    System.out.println("您的幸运数字是:"+num);
                    break;
                }catch (Exception e){
                    System.out.println("输入错误,请输入幸运数字:");
                    continue;
                }
            }
            System.out.println("···游戏结束···");
        }

    4.总结

    万物皆对象,搞清Scanner的源码实现,问题就会迎刃而解。

  • 相关阅读:
    百度mp3地址解密码
    VB 在EXE后附加信息
    截屏函数
    Base64和StrToByte
    The Android ION memory allocator, DMABUF is mentioned as well
    DDC EDID 介绍
    Memory management for graphic processors TTM的由来
    科普 写display driver的必看 How video card works [2D的四种主要操作]
    GEM vs TTM
    DMABUF 背景介绍文章 Sharing buffers between devices
  • 原文地址:https://www.cnblogs.com/masting/p/13454857.html
Copyright © 2011-2022 走看看