Java 异常MyExc3从未在相应try语句的主体中抛出
我已经看到了一个类似的问题,但我还没有找到解决方案,因为在我的例子中,放入try子句的函数实际上抛出了一个异常Java 异常MyExc3从未在相应try语句的主体中抛出,java,exception,Java,Exception,我已经看到了一个类似的问题,但我还没有找到解决方案,因为在我的例子中,放入try子句的函数实际上抛出了一个异常 class MyExc1 extends Exception { } class MyExc2 extends MyExc1 { } class MyExc3 extends MyExc2 { } public class A1 { public static void main(String [] argv) { 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,依此类推。但代码实际上并不编译:
异常MyExc3从未在相应try语句的主体中抛出
这是为什么?您缺少方法签名上的抛出部分
首先,您的代码(如现在所示)无法编译,因为您的main()
可以抛出Exception
,但不会声明它。当您修复该问题时,编译器会告诉您,m()
不会抛出类MyExc3的已检查异常
因此:将抛出异常
添加到公共静态void main(…)
,对于m()
:
这就是检查异常的要点:当您的方法使用时,抛出一些checkedExceptionInstance
。。。然后,必须在该方法中捕获该异常,或者该方法必须通过抛出specificexceptiontype
宣布它抛出了已检查的异常 您缺少方法签名上的抛出部分
首先,您的代码(如现在所示)无法编译,因为您的main()
可以抛出Exception
,但不会声明它。当您修复该问题时,编译器会告诉您,m()
不会抛出类MyExc3的已检查异常
因此:将抛出异常
添加到公共静态void main(…)
,对于m()
:
这就是检查异常的要点:当您的方法使用时,抛出一些checkedExceptionInstance
。。。然后,必须在该方法中捕获该异常,或者该方法必须通过抛出specificexceptiontype
宣布它抛出了已检查的异常 finally总是在运行try-and-catch之后运行(如果发生异常)。所以,在这种情况下,并没有什么可以处理从finally块抛出的异常。您可以通过添加以下内容来解决此问题:
public static void main(String [] argv) throws Exception {
try {
m();
} catch( MyExc3 k ) {
System.out.print(1);
} catch( Exception u ) {
} finally {
throw( new Exception() );
}
}
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();
}
}
}
或者通过这样做:
public static void main(String [] argv) throws Exception {
try {
m();
} catch( MyExc3 k ) {
System.out.print(1);
} catch( Exception u ) {
} finally {
throw( new Exception() );
}
}
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();
}
}
}
但仍然会出现编译错误。这是因为您在main中捕获了一个MyExc3异常,它不会被抛出main()。您在m()中引发了MyExc3异常。但是在m()中也发现了异常。因此,main()中没有出现MyExc3异常。为此,要引发MyExc3异常,您需要添加以下内容:
static void m() throws MyExc3 {
finally总是在运行try和catch之后运行(如果发生异常)。所以,在这种情况下,并没有什么可以处理从finally块抛出的异常。您可以通过添加以下内容来解决此问题:
public static void main(String [] argv) throws Exception {
try {
m();
} catch( MyExc3 k ) {
System.out.print(1);
} catch( Exception u ) {
} finally {
throw( new Exception() );
}
}
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();
}
}
}
或者通过这样做:
public static void main(String [] argv) throws Exception {
try {
m();
} catch( MyExc3 k ) {
System.out.print(1);
} catch( Exception u ) {
} finally {
throw( new Exception() );
}
}
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();
}
}
}
但仍然会出现编译错误。这是因为您在main中捕获了一个MyExc3异常,它不会被抛出main()。您在m()中引发了MyExc3异常。但是在m()中也发现了异常。因此,main()中没有出现MyExc3异常。为此,要引发MyExc3异常,您需要添加以下内容:
static void m() throws MyExc3 {
MyExc3是已检查的还是未检查的异常?我要猜猜看,编译器正在抱怨,因为pax main永远不会得到那个例外。我很欣赏这种快速回归。欢迎加入投票级别;-)MyExc3是已检查的还是未检查的异常?我要猜猜看,编译器正在抱怨,因为pax main永远不会得到那个例外。我很欣赏这种快速回归。欢迎加入投票级别;-)