奇怪的绘画在窗口中

时间:2011-08-29 20:21:41

标签: swing

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

默认情况下,Swing在处理意外异常方面做得不是很好。正如你猜测的那样,Swing显然没有在你的特殊情况下干净利落地恢复。

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

此类对话框不仅适用于您的用户,也适用于处理该代码的任何人。开发人员将比用户更频繁地遇到崩溃,并且有一个开发人员可以选择调查崩溃或只是忽略它的对话框非常有用。

请参阅此相关线程,该线程描述了如何设置异常处理程序:

How can I catch AWT thread exceptions in Java?