-1

在下面的代码中,抛出了两个异常 [FatalException 和 MyException]。Trivial Myexception(覆盖?)使 FatalException 丢失。如何?

如何处理这种情况?

    try{
        try {
        throw new FatalException("Important");
        } 
    finally
    {              
          throw new MyException("trivial");
    }
    }catch (Exception ex) {
        ex.printStackTrace();
    }
}

没有内部 try 块的 catch 类。

(文章提到了它的一个缺陷 Exceptions in java!)所以应该有办法克服它吗?也许最近的标准改变了它?

4

3 回答 3

2

没有办法优雅地处理这个问题:finally接管 Java 中的控制,让你做任何你想做的事情,甚至从try抛出异常的块中正常返回。

如果你必须处理内部异常,你需要为它写很多可能很脆弱的代码:

Exception important = null;
try{
    try {
        important = new FatalException("Important");
    } finally {
        if (important != null) throw important;
        throw  new MyException("trivial");
    }
} catch (Exception ex) {
    ex.printStackTrace();
}

您最好的解决方案是不要编写这样的代码。

于 2013-05-28T03:33:39.990 回答
0

我想这可能是嵌套异常的正确结构。

try
{
    // Some codes to be tried over here.
}
catch(FatalException fe)
{
    System.out.println("Fatal Exception occurred.");
}
catch(Exception e)
{
    System.out.println("Error! ");
}
catch(MyException me){}

以这种方式,可以相应地捕获异常。

于 2013-05-28T03:32:19.773 回答
0

这是因为执行顺序。throw所有意图和目的的初始都是return该方法的事实上的语句(读取:退出点),但是因为它位于带有try块的块内,所以块finally内的代码保证在方法返回之前运行(有一些例外) . 所以在方法/另一个之前,抛出不同的异常,这是一个更新、更快的方法返回。finallyreturnthrow

处理这种情况的方法是永远不会陷入其中。您应该知道这就是 Java 的行为方式,并避免在这个角落自己编程。

于 2013-05-28T03:28:07.533 回答