【报错】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(); }
问题解决如下