快捷搜索: 王者荣耀 脱发

【报错】Scancer的InputMismatchException死循环报错

我们使用Scancer.haxNextInt()等具体类型的函数获取输入值的时候,可能遇到类型不匹配的报错,我们一般会catch报错。但是之后,我们仍然无法继续输入,而是一致循环报错

使用try/catch

public static void test1(){
          
     
    Scanner scanner = new Scanner(System.in);  
    int i = 0;  
    while (i<3){
          
     
        try {
          
     
            int a = scanner.nextInt();  
            System.out.println(a);  
        }catch (Exception e) {
          
     
            e.printStackTrace();  
        }finally {
          
     
            i++;  
        }  
    }  
    scanner.close();  
}

会产生如下报错

或者使用if/else

public static void test2(){
          
     
    Scanner scanner = new Scanner(System.in);  
    int i = 0;  
    while (i<3){
          
     
        if(scanner.hasNextInt()) {
          
     
            int a = scanner.nextInt();  
            System.out.println(a);  
        }else{
          
     
            System.out.println("输入不合法");  
        }  
        i++;  
    }  
    scanner.close();  
}

会产生如下报错

解决方法

产生报错的原因是,Scancer缓冲区中的值尚未被取走,所以下次循环依然是上一次不正确的值

所以我们可以通过next()或者nextLine()取走

public static void test3(){
          
     
    Scanner scanner = new Scanner(System.in);  
    int i = 0;  
    while (i<3){
          
     
        try {
          
     
            int a = scanner.nextInt();  
            System.out.println(a);  
        }catch (Exception e) {
          
     
            System.out.println(scanner.nextLine()+"不合法");  
            e.printStackTrace();  
        }finally {
          
     
            i++;  
        }  
    }  
    scanner.close();  
}

问题解决,如下图

或者,我们可以给scancer重新赋值,清空缓冲区

public static void test4(){
          
     
    Scanner scanner = new Scanner(System.in);  
    int i = 0;  
    while (i<3){
          
     
        try {
          
     
            int a = scanner.nextInt();  
            System.out.println(a);  
        }catch (Exception e) {
          
     
            scanner=new Scanner(System.in);  
            e.printStackTrace();  
        }finally {
          
     
            i++;  
        }  
    }  
    scanner.close();  
}

问题解决如下

经验分享 程序员 微信小程序 职场和发展