Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中捕获具体类型中的抽象异常和重定向_Java_Exception Handling - Fatal编程技术网

在Java中捕获具体类型中的抽象异常和重定向

在Java中捕获具体类型中的抽象异常和重定向,java,exception-handling,Java,Exception Handling,我的代码中有这样一种情况: 抽象的例外 public abstract class AbstractException extends Exception { ... } 由3个具体的异常实现 public class ConcreteException1 extends AbstractException { // ... } public class ConcreteException2 extends AbstractException { // ... } pub

我的代码中有这样一种情况:

抽象的例外

public abstract class AbstractException extends Exception {
   ...
}
由3个具体的异常实现

public class ConcreteException1 extends AbstractException {
   // ...
}

public class ConcreteException2 extends AbstractException {
   // ...
}

public class ConcreteException3 extends AbstractException {
   // ...
}
返回抽象异常实例的方法:

public AbstractException createException()
{
    // create an exception that can be one of the 3 concrete class
}
在我的代码中,我有一个处理异常抛出的方法:

public void handleThrowing() throws ConcreteException1, ConcreteException2, ConcreteException3
{

    //...

    throw createException();

}
此代码未编译,因为存在“未处理的异常类型AbstractException”

为了使它能够编译,我不得不做:

    try
    {
        throw createException();
    }
    catch (ConcreteException1 | ConcreteException2 | ConcreteException3 ex)
    {
        throw ex;
    }
    catch (AbstractException e)
    {
        throw new IllegalStateException("Exception unknown", e);
    }
我觉得维护起来不是很容易,有更好的方法吗


谢谢你的回答

您可以尝试以下方法:

public void handleThrowing() throws AbstractException {

//...

throw createException();

}

修复编译错误的方法(可能不是您想要的):声明
handleThrowing()
public void handleThrowing()AbstractException
我一开始想这样做,但影响太大,包括其他应用程序使用的api,所以我无法更改此方法的签名。好吧,编译器是对的,无法保证
createException()
只返回这三种类型中的一种,而不返回
AbstractException
的任何其他可能的子类。因此,你必须告诉它如何处理这种可能性,而你的
catch
-re
throw
解决方案正是如此。谢谢@Holger,恐怕你是对的,这是“不那么难看”的解决方案。让它难看的是我知道永远不会有任何其他具体类型的例外。。。但是编译器不能断言:)您是否只是将抽象类添加到了框架中?我是说。。。如果框架正在使用中,is必须立即运行。谢谢,是的,这是可能的,但它对代码有太大的影响,包括我不维护的部分。