我的代码请求抛出异常,但是当我这样做时,它表示不应该抛出异常

时间:2013-04-13 21:10:03

标签: java exception-handling override

编译程序时出现此错误:

./GUI/mainWindow.java:30: error: unreported exception Exception; must be caught or declared to be thrown 
            clientUI.initClientUI(); 
                             ^ 
1 error

但是我的方法实际上抛出异常:

public final void initClientUI() throws Exception {

但是,如果我删除“throws Exception”部分,尝试编译,然后再次添加,程序编译成功。谁能解释为什么会这样呢?


修改
如果我将“抛出异常”添加到我调用的方法

public void actionPerformed(ActionEvent e) throws Exception { //<-----add Exception there
            ClientWindow clientUI = new ClientWindow();
            clientUI.initClientUI();

我收到此错误:

./GUI/mainWindow.java:28: error: actionPerformed(ActionEvent) in <anonymous GUI.mainWindow$1> cannot implement actionPerformed(ActionEvent) in ActionListener
        public void actionPerformed(ActionEvent e) throws Exception {
                    ^
  overridden method does not throw Exception
1 error

3 个答案:

答案 0 :(得分:2)

public final void initClientUI() throws Exception {

您告诉编译器允许initClientUI()抛出ExceptionException的任何子类。由于选中了Exception,因此调用initClientUI()的任何方法都必须捕获Exception或将其列在其throws子句中。

我建议您阅读tutorial on exceptions

答案 1 :(得分:1)

您的问题不是您的方法的声明,您的问题是在您打电话时。声明像这样的方法时

public final void initClientUI() throws Exception

你的编译器会知道它会抛出异常。这很好,到目前为止没问题。但是当你调用它时,你必须处理这个异常。

所以当你说

client.initClientUI()

你的编译器说“这个方法抛出异常,请求处理它”。现在您有两个选择:

try {
    client.initClientUI()
}
catch(Exception e) {
    System.out.println(e);
}

或声明使用client.initClientUI()调用throws Exception的方法。

答案 2 :(得分:0)

throws Exception表示你将它抛给调用方法,并且调用方法应该负责通过再次抛出它或使用exception捕获它来处理try catch

你应该这样做

public void actionPerformed(ActionEvent e)  {
            try{
              ClientWindow clientUI = new ClientWindow();
              clientUI.initClientUI();
            }catch(Exception e){
              // handle exception
            }