You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:52:01