在Java中抛出自定义exception

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

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

抛出exception:

 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(); } } } } 

UnsupportedAddressTypeException是RuntimeException的子类,来自JavaDoc:

RuntimeException是在Java虚拟机的正常操作期间可以抛出的那些exception的超类。

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

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

编辑更改单词不得不 要求

你的静态方法应该声明

 private static void testex(String test) throws MyException 

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

从Java教程 :

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

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

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

不符合Catch或Specify Requirement的代码将无法编译。 并非所有例外都受Catch或Specify Requirement的约束。

[…]

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