为什么catch块会因一次异常而被执行两次?

时间:2009-10-22 10:18:27

标签: java swing exception

我有以下代码。

try{
    Twitter twitter = new Twitter(user,password);
    twitter.setStatus(txtStatus.getText());

    JOptionPane.showMessageDialog(null, "Success");
    txtStatus.setText("");
    txtStatus.requestFocus();

}catch(Exception e){
    JOptionPane.showMessageDialog(null, "Some Error.\n" +
                    " If you see this after Success Message..Ignore");
}

即使在我收到“成功消息”对话框后,“Some Error”对话框也出现了。可能是什么原因?如果没有运行时错误,流量控制器就不能逃脱catch块。

即使我也得到异常,“Some Error”对话框出现两次。为什么会发生这种情况?

7 个答案:

答案 0 :(得分:8)

你已经开放了显而易见的可能性,即显示成功对话框后的一行代码会引发异常。你没有捕获一个特定的异常而且你没有显示回溯,所以没有办法说明。使用捕获的异常printStackTrace方法开始调试,以找出它的来源。

答案 1 :(得分:2)

查看您正在捕获的异常及其堆栈跟踪,您可能会受到启发。

我的猜测:第一个对话框后txtStatus为空,或者是抛出异常的requestFocus()方法。

答案 2 :(得分:1)

您的代码实际上可能会被调用两次。尝试将System.out.println语句放在代码顶部或在调试器下运行它并检查它实际上只被调用一次。

答案 3 :(得分:1)

尝试打印堆栈e.printStackTrace() - 成功消息后可能会有例外(例如NullPointerException txtStatus?)

答案 4 :(得分:0)

可以在以下两行之一中抛出异常:

txtStatus.setText("");
txtStatus.requestFocus();

答案 5 :(得分:0)

我同意这里的原子:你的代码被多次调用。添加finally块+更明智的错误反馈。

try{
    Twitter twitter = new Twitter(user,password);
    twitter.setStatus(txtStatus.getText());

    JOptionPane.showMessageDialog(null, "Success");
    txtStatus.setText("");
    txtStatus.requestFocus();

}
catch(Exception e){
    JOptionPane.showMessageDialog(null, "Some Error.\n" + e.getMessage());
}
finally {
    JOptionPane.showMessageDialog(null, "Finally");
}

答案 6 :(得分:0)

我也会把我的两美分投入。

在第一行粘贴断点并使用调试器观察。您可以快速查看它是否正在运行两次,如果某些内容为空,以及错误在哪里。

调试器是你的朋友: - )