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

Java随机猜数程序出现StackOverflowError错误求助

搞定你的栈溢出问题!

嘿,我来帮你解决这个StackOverflowError的麻烦,顺便把代码里的其他小问题也一并修复了。

问题根源分析

首先,栈溢出的核心原因是不必要的递归调用:你的guesser()方法里,当生成重复的随机数时,你调用了guesser()递归自己。每次递归都会在Java的调用栈里新增一个方法帧,当重复次数多了(尤其是当剩余未猜数字很少时,重复概率飙升),调用栈会被迅速填满,直接触发栈溢出。而且这个递归完全是多余的——你已经有while(!check)循环来处理循环猜测了,根本不需要递归。

另外还有两个小问题:

  1. 输入逻辑bug:两个Scanner对象会导致nextLine()读取到空字符串,触发NumberFormatException
  2. 计数逻辑混乱:重复猜测时的count--会导致次数统计错误

修复后的完整代码

import java.util.*;
public class ArrNumGuess {
    public static Integer top, input, guess, count;
    public static ArrayList<Integer> nums;
    public static void main () {
        Scanner scanner = new Scanner(System.in); // 用同一个Scanner处理所有输入
        System.out.println("Please enter the top number");
        top = scanner.nextInt();
        scanner.nextLine(); // 吃掉nextInt()留下的换行符,避免nextLine()读取空串
        
        System.out.println("Please enter the number to guess (1 - " + top + ")");
        input = Integer.parseInt(scanner.nextLine().trim());
        
        nums = new ArrayList<Integer>();
        guess = new Random().nextInt(top) + 1;
        nums.add(guess);
        System.out.println("My first guess is " + guess);
        count = 1;
        
        if(!guess.equals(input)) {
            guesser();
        }
        
        System.out.println("It took me " + count + " tries to find " + input);
    }
    
    public static void guesser() {
        boolean check = false;
        while(!check) {
            guess = new Random().nextInt(top) + 1;
            
            if(guess.equals(input)) {
                // 猜中目标,结束循环
                check = true;
                System.out.println("My guess was " + guess);
                count++;
            } else if(!nums.contains(guess)) {
                // 没猜中且是新数字,加入列表并计数
                System.out.println("My guess was " + guess);
                nums.add(guess);
                count++;
            }
            // 重复数字直接跳过,重新生成,不计数也不加入列表
        }
    }
}

关键修改点说明

  • 统一Scanner对象:用一个scanner处理所有输入,避免输入缓冲区的换行符问题,同时在nextInt()后调用nextLine()清空残留的换行。
  • 移除递归调用:删除了原来的count--; guesser();逻辑,重复数字直接跳过,进入下一次循环重新生成,彻底避免栈溢出。
  • 简化判断逻辑:先判断是否猜中目标,再判断是否是新数字,逻辑更清晰,符合你“将未出现过的数存入ArrayList”的需求。
  • 修正计数逻辑:只有未重复的有效猜测才会增加计数,统计结果更准确。

可选调整:统计所有猜测次数(包括重复)

如果你的需求是统计所有尝试次数(包括重复猜测),只需要把count++移到循环开头,不管是否重复都计数:

public static void guesser() {
    boolean check = false;
    while(!check) {
        guess = new Random().nextInt(top) + 1;
        count++; // 每次猜测都计数,包括重复的
        
        if(guess.equals(input)) {
            check = true;
            System.out.println("My guess was " + guess);
        } else if(!nums.contains(guess)) {
            System.out.println("My guess was " + guess);
            nums.add(guess);
        }
        // 重复数字只计数,不加入列表
    }
}

内容的提问来源于stack exchange,提问作者xXMavhawkXx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:40:05