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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 01:09:09