在Java中抛出自定义异常

时间:2012-05-13 20:19:19

标签: java

为什么我需要在尝试抛出它时用try / catch包装我抛出的自定义异常,但是我不必为通用异常执行此操作?就像在示例中一样,我的Exception子类:

public class MyException extends Exception {
    public MyException(String msg) {
        super(msg);
    }
}

抛出异常:

public class Exe {

    private static void testex(String test) {
        if (null!=test) {
            throw new UnsupportedAddressTypeException();
        } else {//Removing try/catch block results in compile failure
          try {
            throw new MyException("message");
          } catch (MyException e) {
            e.printStackTrace();
          }
        }
    }
}

4 个答案:

答案 0 :(得分:15)

UnsupportedAddressTypeException是RuntimeException的子类,来自JavaDoc:

  

RuntimeException是在Java虚拟机正常运行期间可以抛出的那些异常的超类。

     

不需要方法在其throws子句中声明RuntimeException的任何子类,这些子类可能在方法执行期间被抛出但未被捕获。

答案 1 :(得分:12)

如果您的异常扩展了java.lang.Exception,则必须捕获它(或重新抛出)。如果它扩展了java.lang.RuntimeException,则不需要这样做。您会发现所有标准例外都是如此。

修改不得更改为不需要

答案 2 :(得分:7)

你的静态方法应该声明

private static void testex(String test) throws MyException

如果你想让方法抛出它(而不是在内部捕获并处理它)。

答案 3 :(得分:0)

来自Java Tutorial

  

有效的Java编程语言代码必须遵守Catch或Specify   需求。这意味着代码可能会抛出某些异常   必须包含以下任何一项:

     
      
  • 捕获异常的try语句。 try必须为异常提供处理程序,如捕获和处理中所述   异常。

  •   
  • 指定可以抛出异常的方法。该方法必须提供一个throws子句,列出异常,如中所述   指定方法引发的异常。

  •   
     

不遵守Catch或Specify Requirement的代码不会   编译。   并非所有例外都受Catch或Specify Requirement的约束。

     

[...]

     

运行时异常不受Catch或Specify Requirement的约束。运行时异常是RuntimeException及其子类指示的异常。