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

使用JOptionPane时无法退出try-catch及while循环问题求助

解决JOptionPane取消/关闭按钮导致循环无法退出的问题

首先得明确问题根源:当你点击取消或关闭按钮时,JOptionPane.showInputDialog()会返回null,而你直接把这个null传给Integer.parseInt(),会立刻触发NumberFormatException,进入对应的catch块后把value设为true,导致循环继续。你后面写的if(players == JOptionPane.CANCEL_OPTION || players == JOptionPane.CLOSED_OPTION)完全起不到作用——因为这两个常量是对话框的返回状态码,不是用户输入的内容,而且此时players要么是之前的旧值,要么根本没初始化,不可能等于这两个值。

下面给你几种可行的解决方法:

方法一:先判断输入是否为null(最直接)

先捕获输入对话框的返回字符串,优先处理取消/关闭的情况,再进行数字解析:

// 记得先初始化players变量,比如int players = 0;
boolean value = true;
while(value) {
    String input = JOptionPane.showInputDialog("Would you like to start a two-player(enter 2) or three-player(enter 3) game?");
    
    // 用户点击取消或关闭,直接退出循环
    if(input == null) {
        value = false;
        break;
    }
    
    try {
        players = Integer.parseInt(input);
        if(players != 2 && players != 3) {
            throw new InputMismatchException();
        }
        value = false; // 输入合法,退出循环
    } catch(InputMismatchException e) {
        JOptionPane.showMessageDialog(null, "Not a valid input. Please enter 2 or 3.");
        value = true;
    } catch(NumberFormatException f) {
        JOptionPane.showMessageDialog(null, "Not a valid input. Please enter a number.");
        value = true;
    }
}

这个方法的核心是先处理null的情况,避免进入异常处理流程,直接终止循环。

方法二:在异常处理中区分取消操作

如果你不想提前判断null,也可以在NumberFormatException的catch块里,通过检查输入是否为null来判断用户是否点击了取消:

boolean value = true;
String input = null;
while(value) {
    try {
        input = JOptionPane.showInputDialog("Would you like to start a two-player(enter 2) or three-player(enter 3) game?");
        players = Integer.parseInt(input);
        if(players != 2 && players != 3) throw new InputMismatchException();
        value = false;
    } catch(InputMismatchException e) {
        JOptionPane.showMessageDialog(null, "Not a valid input. Please enter 2 or 3.");
        value = true;
    } catch(NumberFormatException f) {
        // 如果是因为输入为null导致的异常,直接退出循环
        if(input == null) {
            value = false;
        } else {
            JOptionPane.showMessageDialog(null, "Not a valid input. Please enter a number.");
            value = true;
        }
    }
}

这种方式把取消操作的判断放在异常处理里,适合不想打乱原有代码结构的情况。

额外提示:避免变量未初始化问题

你的原代码里如果players没有提前初始化,后面的if(players == ...)会编译报错。记得在循环外先声明并初始化这个变量,比如int players = 0;。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:12:58