Java随机猜数程序出现StackOverflowError错误求助
搞定你的栈溢出问题!
嘿,我来帮你解决这个StackOverflowError的麻烦,顺便把代码里的其他小问题也一并修复了。
问题根源分析
首先,栈溢出的核心原因是不必要的递归调用:你的guesser()方法里,当生成重复的随机数时,你调用了guesser()递归自己。每次递归都会在Java的调用栈里新增一个方法帧,当重复次数多了(尤其是当剩余未猜数字很少时,重复概率飙升),调用栈会被迅速填满,直接触发栈溢出。而且这个递归完全是多余的——你已经有while(!check)循环来处理循环猜测了,根本不需要递归。
另外还有两个小问题:
- 输入逻辑bug:两个
Scanner对象会导致nextLine()读取到空字符串,触发NumberFormatException - 计数逻辑混乱:重复猜测时的
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
相关产品推荐
相关产品推荐

