0

我正在尝试在 actionlistener 的内部类中使用 try/catch 语句,但即使我故意触发它们,它也不会捕获异常。这是代码摘录:

btnPerformCalculation.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent ae) {

        double runtime = Math.abs(Double.parseDouble(txtRunTime.getText()));
        double downtime = Math.abs(Double.parseDouble(txtDownTime.getText()));
        double blockedtime = Math.abs(Double.parseDouble(txtBlockedTime.getText()));
        double lineefficiency = 100 * runtime / (runtime + downtime + blockedtime);

        try {
            txtEfficiencyAnswer.setText(String.format("%.2f", lineefficiency));
        } catch (Exception e) {
            JOptionPane.showMessageDialog(frame, "Error:" + e.getMessage());
            txtRunTime.setText("0");
            txtDownTime.setText("0");
            txtBlockedTime.setText("0");
        }
    }
});
4

3 回答 3

0

首先,您如何确定 JOptionPane.showMessageDialog 没有引发异常?我建议将输出或日志记录作为捕获中的第一条语句。其次,并不是所有的“异常”都是异常的子类。尝试使用 catch (Throwable e) 来查看您遇到的特定问题是否得到解决。

我不建议将 catch(Throwable e) 留在代码中,因为这也会捕获非常低级别的 jvm 问题。但它至少会帮助你了解正在发生的事情。

于 2012-03-15T14:20:05.970 回答
0

您捕获的唯一例外是在txtEfficiencyAnswer.setText(String.format("%.2f", lineefficiency));. 所有其他计算(例如,将可能为空的文本值转换为双精度值都是在 try 块之前完成的,因此不会被捕获。

假设它txtEfficiencyAnswer是 aJTextComponent或 a JLabel,则该块中出现异常的唯一明显原因是 NullPointerExceptionif txtEfficiencyAnsweris null。如果它不为 null,那么您将永远不会进入 catch-block。

于 2012-03-15T14:46:58.470 回答
-4

大概setText扔了RuntimeException

  1. 将 catch 语句更改为catch (RuntimeException e)
  2. 打印堆栈跟踪。
于 2012-03-15T14:19:31.247 回答