【问题标题】:exception MyExc3 is never thrown in body of corresponding try statement异常 MyExc3 永远不会在相应的 try 语句的主体中抛出
【发布时间】:2019-06-15 08:42:53
【问题描述】:

我已经看到了一个类似的问题,但我还没有找到解决方案,因为在我的例子中,放在 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 的异常。然后,此异常应由应打印 3 的catch(MyExcp3 z) 处理,依此类推。但是代码实际上并没有编译:

异常 MyExc3 不会在相应的 try 语句体中抛出

为什么会这样?

【问题讨论】:

  • MyExc3 是经过检查还是未经检查的异常?我猜想检查一下,编译器在抱怨,因为 pax main 永远不会得到那个异常
  • 感谢您的快速回归。并欢迎投票水平;-)

标签: java exception


【解决方案1】:

您缺少方法签名上的throws 部分。

首先,您的代码(如现在给出的)无法编译,因为您的main() 可以抛出Exception,但没有声明它。当您修复该问题时,编译器会告诉您m() 不会引发 MyExc3 类的已检查异常。

因此:将throws Exception 添加到public static void main(...)m() 相同:

static void m() throws MyExc3 {

这就是检查异常的要点:当您的方法使用 throw someCheckedExceptionInstance ... 时,必须在该方法中捕获该异常,或者该方法必须通过 throws TheSpecificExceptionType宣布它抛出检查异常!

【讨论】:

    【解决方案2】:

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

    但是,您仍然会收到编译错误。那是因为你在 main 中捕获了一个 MyExc3 异常,它没有被抛出到 main()。您在 m() 中抛出了 MyExc3 异常。但是您在 m() 中也发现了异常。所以 main() 中没有出现 MyExc3 异常。为此,要抛出 MyExc3 异常,您需要添加以下内容:

     static void m() throws MyExc3 {
    

    【讨论】:

      猜你喜欢
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 2017-07-01
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多