永远不会在相应的try语句的主体中引发异常MyExc3

时间:2019-06-15 08:42:53

标签: 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 {
      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 ma​​in调用方法m();,该方法打印2并引发一个名为MyExc3的异常。然后,应由catch(MyExcp3 z)处理此异常,该异常应打印3,依此类推。但是代码实际上无法编译:

  

永远不会在相应的try语句的正文中抛出异常MyExc3

那是为什么?

2 个答案:

答案 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();
        }
    }
}