在Java中,如果捕获并重新抛出一般异常,外部方法仍然能够捕获特定异常吗?
换句话说,我可以这样做:
try {
try {
//...
} catch (Exception e) {
//...
throw e;
}
} catch (SpecificException e) {
//...
}
在Java中,如果捕获并重新抛出一般异常,外部方法仍然能够捕获特定异常吗?
换句话说,我可以这样做:
try {
try {
//...
} catch (Exception e) {
//...
throw e;
}
} catch (SpecificException e) {
//...
}
重新抛出异常不会改变它的任何内容(它仍然是最初抛出的同一个对象)。
虽然 jtahlborn 的答案是正确的,但还有一个优点:编译器会看到您正在抛出泛型类型的异常(即使在运行时它只能是特定类的异常),并将强制您在方法头。
private void test() throws FileNotFoundException {
try {
throw new FileNotFoundException("Es una exception");
} catch (IOException e) {
throw e; <-- Error because the method only throws
FileNotFoundException, not IOException
}
}
e
确实是 FileNotFoundException,但由于它被声明为 IOException,编译器可以使用更广泛的类。您可以做的是“投射”异常。
throw (FileNotFoundException) e;
Eclipse 将内部捕获中的“throw e”标记为未处理的异常,但它确实捕获了异常,因为当我运行它时,它会打印“它工作!”。谢谢@jtahlborn。不幸的是,这意味着在某个地方仍然需要一个不必要的 try/catch 块。
public class Tester {
public static void main(String[] args) {
try {
try {
throw new SpecificException("Test!");
} catch (Exception e) {
throw e;
}
} catch (SpecificException e) {
System.out.println("It worked!");
}
}
}