如何用try/catch/finally处理Scanner输入错误并修复猜数字游戏问题
解决猜数字游戏的输入异常与变量初始化问题
嘿,我来帮你搞定这个猜数字游戏的问题!你的代码思路没问题,但确实有几个小细节没处理好,导致了Scanner失效和变量未初始化的报错,咱们一步步来修正:
原代码的核心问题
- Scanner输入缓冲区残留:当用户输入非整数触发
InputMismatchException时,无效的输入内容会留在Scanner的缓冲区里,后续调用nextInt()会反复读取这个无效内容,陷入无限循环。 - 变量未初始化:
numberOfUser和guessNumber仅在try块内赋值,编译器无法保证它们一定会被赋值(比如用户一直输入错误的话),所以会报未初始化的错误。 - 缺少输入范围校验:没有判断用户输入的最大值是否大于0,输入0或负数也应该触发错误提示。
修正后的完整代码
package gessinggame; import java.util.InputMismatchException; import java.util.Random; import java.util.Scanner; public class GessingGame { public static void main(String[] args) { //<editor-fold desc="Start Variables and Objects"> Random random = new Random(); Scanner input = new Scanner(System.in); int counter = 0; // 给变量赋初始值,解决未初始化报错 int numberOfUser = 0; int guessNumber = 0; boolean isValidInput; System.out.print("Try to guess my number! What should be the highest number I can go up to?: "); do{ isValidInput = false; try{ numberOfUser = input.nextInt(); // 新增:校验输入是否大于0 if(numberOfUser > 0){ guessNumber = random.nextInt(numberOfUser); isValidInput = true; } else { System.out.print("That doesn't work! Please enter an integer higher than 0 :"); } }catch(InputMismatchException e) { System.out.print("That doesn't work! Please enter an integer higher than 0 :"); // 关键:清空Scanner缓冲区的无效输入 input.nextLine(); } }while(!isValidInput); //</editor-fold> //<editor-fold desc="do-while loop (higher/lower/equal)"> System.out.println("Try to guess my number! Its from 0 to " + numberOfUser + " !"); System.out.println("---------------------------------------------------"); do{ int userguess; // 这里同样要处理猜数字时的输入异常 try{ userguess = input.nextInt(); if(userguess > numberOfUser) { System.out.println("Oh man, at the beginning you said that the highest number is: " + numberOfUser); } else if(userguess < 0) { System.out.println("My number is always taller than 0"); } else { if(guessNumber < userguess) { System.out.println("lower"); counter++; } else if(guessNumber > userguess) { System.out.println("higher"); counter++; } else { counter++; break; } } }catch(InputMismatchException e){ System.out.print("Please enter a valid integer: "); input.nextLine(); } }while(true); //</editor-fold> //<editor-fold desc="print final result"> System.out.println("You guessed my number! My number was: " + guessNumber + "! You needed " + counter + " attempts!"); //</editor-fold> input.close(); // 用完关闭Scanner } }
关键修改点说明
- 变量初始化:给
numberOfUser和guessNumber赋初始值0,解决编译器的未初始化报错。 - 清空输入缓冲区:在catch块中调用
input.nextLine(),把触发异常的无效输入从缓冲区中清除,避免后续nextInt()重复读取无效内容。 - 输入范围校验:新增
if(numberOfUser > 0)判断,确保用户输入的最大值是正整数,否则提示错误。 - 猜数字环节的异常处理:原来的猜数字循环没有处理输入异常,现在也加上了try/catch和缓冲区清空,保证整个程序输入非整数时都不会崩溃。
- 优化循环条件:用
isValidInput布尔变量代替原来的x,逻辑更清晰易读。 - 关闭Scanner:程序结束前调用
input.close(),释放资源。
这样修改后,程序就能完美处理各种输入错误,只接收有效的正整数,而且不会崩溃啦!
内容的提问来源于stack exchange,提问作者Mindmax
相关产品推荐
相关产品推荐

