为什么我需要在尝试抛出它时用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();
}
}
}
}
答案 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编程语言代码必须遵守Catch或Specify 需求。这意味着代码可能会抛出某些异常 必须包含以下任何一项:
捕获异常的try语句。 try必须为异常提供处理程序,如捕获和处理中所述 异常。
指定可以抛出异常的方法。该方法必须提供一个throws子句,列出异常,如中所述 指定方法引发的异常。
不遵守Catch或Specify Requirement的代码不会 编译。 并非所有例外都受Catch或Specify Requirement的约束。
[...]
运行时异常不受Catch或Specify Requirement的约束。运行时异常是RuntimeException及其子类指示的异常。