【问题标题】:Strange painting in window橱窗里奇怪的画
【发布时间】:2011-11-06 07:42:21
【问题描述】:

当像这样在摇摆监听器中未捕获的异常时,我们观察到奇怪的绘画行为:

mytable.getSelectionModel().addListSelectionListener(
        new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                ... no try catch and npe exception happens
            }
        });

是因为我们正在挥杆并中断正常的绘画/更新吗?在抛出的窗口中,我们开始在奇怪的地方看到按钮,滚动条出现多次。如果有怎么办?尝试/抓住每个摇摆听众?

【问题讨论】:

    标签: swing


    【解决方案1】:

    怪画的原因确实是听者抛出的异常。解决方案是避免侦听器中的异常。

    不过,将每个侦听器代码嵌入到 try/catch 块中并不是解决方案。解决方案是避免错误,并在它们出现时修复它们。奇怪的绘画以及异常的堆栈跟踪使您可以检测侦听器代码中何时出现错误。 NullPointerException 永远不应该发生。如果发生这种情况,则说明您有错误。捕获异常并吞下它只会使 bug 变得更糟,因为它不会被检测到,并且会导致向用户显示错误信息,这可能会根据这些错误信息做出灾难性的操作。

    【讨论】:

    • 认真的吗?解决方案是永远不会有错误?
    • 解决bug的方法是修复bug。您可以隐藏该错误,但它可能会导致其他更难找到和更严重的错误。假设如果某些医学检查显示癌症,您需要展示一个大的红色 binking 标签。假设您在显示大红色闪烁标签的行之前有一个错误。您是否愿意直接注意到错误并修复它?还是您更愿意隐藏错误,从而从不显示闪烁的大红色标签,导致患者因癌症未被发现而死亡?
    【解决方案2】:

    默认情况下,Swing 在处理意外异常方面做得不是特别好。如您所料,Swing 在您的特定情况下显然没有完全恢复。

    鉴于会发生错误,我更愿意提供一个异常处理程序,它会向用户显示一个对话框。这个对话框最好有一个“报告错误”按钮,允许用户将堆栈跟踪通过电子邮件发送给您,以便您解决问题。该对话框还应允许用户忽略问题并继续。当对话框关闭时,您应该正常返回,这应该不会影响 AWT 事件队列。

    这种类型的对话框不仅对您的用户有用,而且对任何处理代码的人都很有用。开发人员会比用户更频繁地遇到崩溃,并且有一个对话框非常有帮助,开发人员可以在其中选择调查崩溃或忽略它。

    请参阅描述如何设置异常处理程序的相关线程:

    How can I catch AWT thread exceptions in Java?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 2016-04-19
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      相关资源
      最近更新 更多