使用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
相关产品推荐
相关产品推荐

