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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:57:00