Java含break的while循环在JOptionPane错误弹窗中未按预期工作
问题分析与修复
你的程序冻结是因为死循环,代码逻辑完全错误:
- 第一次弹窗后得到的
responseRemovableDiskA值在while循环里从未更新,循环内的if (responseRemovableDiskA != JOptionPane.YES_OPTION) break;永远不会触发,导致循环无限执行,卡住程序。 - 循环结束后还额外执行了一次弹窗,不符合"点击Retry重复弹窗,直到Cancel或关闭"的需求。
正确实现逻辑
应该用循环包裹弹窗操作:每次弹窗后根据用户选择决定是否继续。用do-while循环更合适,因为至少需要弹出一次对话框;当用户点击"Retry"(对应JOptionPane.YES_OPTION)时重复弹窗,点击"Cancel"(NO_OPTION)或关闭对话框(CLOSED_OPTION)时退出循环。
修正后的代码
removableDiskA.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (e.getClickCount() == 2) { // 自定义按钮文本 UIManager.put("OptionPane.yesButtonText", "Retry"); UIManager.put("OptionPane.noButtonText", "Cancel"); int response; do { // 弹出错误对话框,获取用户响应 response = JOptionPane.showConfirmDialog( null, "A: \\ is not accessible. \n\nThis device is not ready.", "Removable Disk (A:)", JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE ); // 只有当用户点击Retry时,才继续循环弹窗 } while (response == JOptionPane.YES_OPTION); } } });
关键说明
do-while循环保证对话框至少弹出一次,符合双击图标立即弹窗的需求。- 每次循环都会重新调用
showConfirmDialog,更新response的值,避免死循环。 - 关闭对话框时,
JOptionPane.showConfirmDialog会返回JOptionPane.CLOSED_OPTION,这个值不等于YES_OPTION,所以会自动退出循环,无需额外判断。
内容的提问来源于stack exchange,提问作者Alanzhou
相关产品推荐
相关产品推荐

