Java中的例外情况

时间:2011-04-14 01:21:40

标签: java

我是Java新手并试图了解Java中的异常。

class MyException extends Exception {  

      void someMethod () {  
            doStuff();  
      } 

      void doStuff() throws MyException {  

         try {  
             throw new MyException();  
          }  

          catch(MyException me) {  
             throw me;  
          }  
       }  
}  

本程序给出错误:

  

java:3:未报告的异常MyException;必须被抓住或宣布被抛出

 doStuff();
         ^

try和catch块是在doStuff()方法中编写的。此外doStuff()方法“抛出”MyException,那么为什么还需要在MyException中抛出someMethod()

4 个答案:

答案 0 :(得分:7)

你确实捕获了MyException,但你重新抛出它,所以需要捕获一个新的活动异常。

这称为已检查的异常。无论何时调用doStuff()方法,都需要将它包装在myException的try / catch中,或者你可以声明你的方法也会抛出MyException。

这保证了在编码过程中至少会考虑已知的异常。

答案 1 :(得分:3)

你需要从someMethod“重新抛出”异常,因为MyException是“ Checked Exception ”(不会扩展RuntimeException - 这是一个“未选中异常“)和编译器强制您处理Checked Exceptions,如下所示:

class MyException extends Exception {

    /**
     * @throws MyException because it is a checked Exception (doesn't extend RuntimeException) and the compiler
     * forces you to handle Checked Exceptions.
     */
    void someMethod() throws MyException {
        doStuff(); 

    }

    void doStuff() throws MyException {
        try {
            throw new MyException();
        } catch (MyException me) {
            throw me;
        }
    }
}

或者您需要在某些方法中处理MyException,因此编译器很高兴,如下所示:

class MyException extends Exception {


    void someMethod() {
        try {
            doStuff();
        } catch (MyException ex) {
            //Do Something useful with the Exception...
            Logger.getLogger(MyException.class.getName()).severe("A Severe Exception Message");
        }

    }

    void doStuff() throws MyException {
        try {
            throw new MyException();
        } catch (MyException me) {
            throw me;
        }
    }
}

答案 2 :(得分:2)

你在doStuff()方法体中的含义并不重要 - 因为你已声明它“抛出MyException”,那么调用方法 - 在本例中是someMethod() - 必须要么处理异常(通过try / catch块)或声明为自己抛出相同的异常。在后一种情况下,doStuff()抛出的异常将自动传播到someMethod()的调用者。

换句话说:你在doStuff()中捕获异常的事实并不重要,因为doStuff()被声明为抛出异常。你甚至可以删除doStuff()的方法体(使它什么都不做),你仍然需要在someMethod()中处理异常。

答案 3 :(得分:2)

因为doStuff()再次抛出异常。你将不得不再次尝试将其包裹起来。

void someMethod () {  

      try
      {
        doStuff();  
      }
      catch ( MyException e )
      {
         e.printStackTrace();
      }

  } 

或者另一种选择是不再抛出异常。每次抛出异常都必须抓住它。