我已经看过类似的问题,但是我还没有找到解决方案,因为在我的情况下,放在try子句中的函数实际上会引发异常。
class MyExc1 extends Exception { }
class MyExc2 extends MyExc1 { }
class MyExc3 extends MyExc2 { }
public class A1 {
public static void main(String [] argv) {
try {
m();
} catch( MyExc3 k ) {
System.out.print(1);
} catch( Exception u ) {
} finally {
throw( new Exception() );
}
}
static void m() {
try {
System.out.print(2);
throw( new MyExc3() );
}catch( MyExc3 z ) {
System.out.print(3);
}catch( Exception d ) {
System.out.print(4);
}finally {
System.out.print(5);
}
}
}
在我的try块中,psv main调用方法m();
,该方法打印2并引发一个名为MyExc3的异常。然后,应由catch(MyExcp3 z)
处理此异常,该异常应打印3,依此类推。但是代码实际上无法编译:
永远不会在相应的try语句的正文中抛出异常MyExc3
那是为什么?
答案 0 :(得分:0)
您缺少方法签名上的throws
部分。
首先,由于您的main()
可以抛出Exception
,但没有声明它,因此您的代码(现在给出)无法编译。解决此问题后,编译器会告诉您m()
不会引发MyExc3类的检查异常。
因此:将throws Exception
添加到public static void main(...)
并为m()
添加相同的内容:
static void m() throws MyExc3 {
这是检查异常的关键:当您的方法使用throw someCheckedExceptionInstance
...时,该陷阱必须被捕获在该方法中,或者该方法必须通过throws TheSpecificExceptionType
announce 它引发了检查异常!
答案 1 :(得分:0)
最后总是在运行try和catch之后运行(如果发生异常)。因此,在这种情况下,没有任何东西可以处理您从finally块引发的异常。您可以通过添加以下内容来解决此问题:
<SN>aaaa</SN>
<LN>cccc</LN>
<SN>bbbb</SN>
<LN>cccc</LN>
<SN>dddd</SN>
<LN>ffff</LN>
<SN>eeee</SN>
<LN>ffff</LN>
或执行以下操作:
public static void main(String [] argv) throws Exception {
try {
m();
} catch( MyExc3 k ) {
System.out.print(1);
} catch( Exception u ) {
} finally {
throw( new Exception() );
}
}
但是,仍然会出现编译错误。这是因为您在main中捕获了一个 MyExc3 异常,该异常未抛出到main()上。您在m()中抛出了MyExc3异常。但是您也在m()中捕获了异常。因此,main()中没有MyExc3异常。为此,要引发MyExc3异常,您需要添加以下内容:
public static void main(String [] argv) {
try {
m();
} catch( MyExc3 k ) {
System.out.print(1);
} catch( Exception u ) {
} finally {
try {
throw( new Exception() );
} catch (Exception e) {
e.printStackTrace();
}
}
}