在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。