Java TicTacToe项目Integer.parseInt报NumberFormatException问题求助
故障根本原因
你代码的核心问题出在递归调用的逻辑处理错误:
- 当首次输入
one two触发非法校验后,你调用了getValidCoordinates()重新请求输入,但没有对这次递归调用的结果做返回,也没有终止当前方法的执行。 - 第二次输入
1 2时,递归调用的那层方法确实正常执行并返回了合法坐标,但调用完递归的第一层方法会继续向下执行,依然尝试把第一次输入的one、two转成整数,最终触发NumberFormatException。
额外的优化点:每次递归都新建Scanner对象属于不必要的资源浪费,重复创建也可能存在输入流读取异常的隐患。
修复方案
推荐用循环替代递归实现输入校验,避免递归深度过高导致栈溢出问题,两种可运行的修复方案如下:
方案1:修改原有递归逻辑(补全返回语句)
import java.util.Scanner; class Scratch { public static void main(String[] args) { getValidCoordinates(); } public static int[] getValidCoordinates() { Scanner scanner = new Scanner(System.in); System.out.println("请输入坐标:"); String[] coordinates = scanner.nextLine().split(" "); if (!coordinates[0].matches("(-|\\+)?\\d+") || !coordinates[1].matches("(-|\\+)?\\d+")) { System.out.println("请输入数字!"); // 直接返回递归调用的结果,终止当前层后续代码执行 return getValidCoordinates(); } int[] numCoordinates = {Integer.parseInt(coordinates[0]), Integer.parseInt(coordinates[1])}; if (numCoordinates[0] > 3 || numCoordinates[0] < 1 || numCoordinates[1] > 3 || numCoordinates[1] < 1) { System.out.println("请输入1-3范围内的数字!"); // 同样直接返回递归结果,终止当前层执行 return getValidCoordinates(); } return numCoordinates; } }
方案2:循环实现(更稳定,推荐使用)
import java.util.Scanner; class Scratch { // 全局复用同一个Scanner对象,避免重复创建资源 private static final Scanner SCANNER = new Scanner(System.in); public static void main(String[] args) { getValidCoordinates(); } public static int[] getValidCoordinates() { while (true) { System.out.println("请输入坐标:"); String[] coordinates = SCANNER.nextLine().split(" "); // 校验输入是否为数字 if (!coordinates[0].matches("(-|\\+)?\\d+") || !coordinates[1].matches("(-|\\+)?\\d+")) { System.out.println("请输入数字!"); continue; } // 转换为整数 int x = Integer.parseInt(coordinates[0]); int y = Integer.parseInt(coordinates[1]); // 校验数值范围 if (x < 1 || x >3 || y <1 || y>3) { System.out.println("请输入1-3范围内的数字!"); continue; } // 校验全部通过,返回结果 return new int[]{x, y}; } } }
内容的提问来源于stack exchange,提问作者Kabraxis Luvos
相关产品推荐
相关产品推荐

