抛出父类异常强制抛出其子类异常事件,但是捕获/处理子类异常?

时间:2017-12-18 15:39:51

标签: java exception

我刚才有机会使用第三方API。它有一个父类异常FooException,它有多个子类异常。

FooException
     |
      --- BarException
      --- BuzException
      --- ZapException

我必须调用此库中的方法名称run,此方法抛出FooException但我决定让调用者处理它但是我需要捕获特定的子类异常BarException。如果它被捕获,那么我必须忽略它然后继续for循环。对于所有其他子类异常被抛出然后让调用者必须正确捕获/处理它们。

public void handleGracefully() throws FooException {      
    for(......) {
        try {
           3rdPartyAPI.run();
        } catch (BarException be) { } // silently ignore
    }
} 

基于我对Java异常的有限理解,BarException应该在catch块中捕获,而不是由其父异常类FooException抛出。我理解正确吗?

1 个答案:

答案 0 :(得分:0)

你对这个概念的理解是正确的。

写下这一行:

public void handleGracefully() throws FooException { 

你基本上是在说你的编译器"每当有人试图调用这个函数时,你必须要抓住FooException"。如果你抓到BarException,则会抛出BarException,而不是他的父母。

请考虑以下代码:

public class MainClass {

    public static void main(String[] args) {
        try {
            handleGracefully();
        }   catch (FooException e)  {
            System.out.println("World is not that cool");
        }
    }

    public static void handleGracefully() throws FooException {
        try {
            hello();
        } catch (BarException be) {
            System.out.println("Hello world");
        }
    }

    public static void hello() throws BarException     {
        throw new BarException("NYAAH");
    }
}

结果:

Hello world

运行此MainClass,您将看到您永远不会遇到World is not that cool。相反,您将在控制台日志中遇到Hello world。在throw处理中添加BarException声明会触发main()日志记录:

    public static void handleGracefully() throws FooException {
        try {
            hello();
        } catch (BarException be) {
            System.out.println("Hello world");
            throw new FooException("BLEEEEH");
        }
    }

结果:

Hello world World is not that cool

POST SCRIPTUM

无论如何,如果这个答案中的某些内容是错误的(例如与方法的static值有关,或者任何使我的假设成错的事情),请随意指出。