从接口实现方法中抛出自定义异常

时间:2010-08-08 13:22:46

标签: java

我正在尝试将自定义throws子句添加到由接口定义的方法中。这是不可能的。我怎么能绕过它呢?这是一些代码:

private void sendRequestToService(final ModuleRequest pushRequest) 
{

    ServiceConnection serviceConnection = new ServiceConnection()
    {

        public void onServiceConnected(ComponentName name, IBinder service) 
        {

            try
            {

                //some lines..

            } catch (RemoteException e)
            {
                throw new RuntimeException(new UnavailableDestException()) ;
            }
        }


    };

}

知道如何抛出我的自定义异常吗?

2 个答案:

答案 0 :(得分:12)

有两种类型的例外,已检查未选中。任何Throwable都是其中之一。

已检查例外的示例是IOException;可能最有名的未经检查的例外是NullPointerException

方法throw必须在其throws子句中声明的任何已检查异常。当你@Override一个方法(实现interface方法或覆盖超类中的继承方法)时,必须满足某些要求,其中之一就是throws子句不能引起冲突简单来说,子类/实现可以抛出 LESS ,而不是 MORE 检查异常。

未经检查的异常定义为RuntimeException及其子类,Error及其子类。它们不必在方法的throws子句中声明。

因此,在这种特殊情况下,如果您希望在throw方法的实现中CustomException interface未在其throws子句中列出它,那么可以CustomException extends RuntimeException,使其取消选中。 (它还可以extends RuntimeException的任何子类,例如IllegalArgumentExceptionIndexOutOfBoundsException在某些情况下可能更合适。)

这将允许您根据需要编译代码,但请注意,选择checked和unchecked异常之间的选择不应过于轻松。对于许多人来说,这是一个有争议的问题,除了让代码按照您想要的方式编译之外,还有许多因素需要考虑。您可能需要考虑重新设计interface而不是让实现者抛出interface合同未指定的各种未记录的未经检查的异常。

参考

相关问题

另见

  • Effective Java 2nd Edition
    • 项目58:对可恢复条件和编程错误的运行时异常使用已检查的异常
    • 第59项:避免不必要地使用已检查的例外
    • 第60项:赞成使用标准例外
    • 第61项:抛出适用于抽象的例外
    • 第62项:记录每种方法抛出的所有异常

解决方法“解决方案”

如果无法重新设计,那么将CustomException包裹在RuntimeException(或其子类)中将“正常”。也就是说,而不是:

// ideal solution, not possible without redesign

@Override public static void someMethod() throws CustomException {
    throw new CustomException();
}

//...
try {
    someMethod();
} catch (CustomException e) {
    handleCustomException(e);
}

如果你坚持,你可以做以下事情:

// workaround if redesign is not possible
// NOT RECOMMENDED!

@Override public static void someMethod() {
    throw new RuntimeException(new CustomException());
}

//...
try {
    someMethod();
} catch (RuntimeException e) { // not catch(CustomException e)

    if (e.getCause() instanceof CustomException) {
        handleCustomException((CustomException) e.getCause());
    } else {
        throw e; // preserves previous behavior
    }

}

需要重申的是,这通常是 NOT 推荐的技术。如果可能的话,你应该在设计层面解决问题,但除此之外,这确实是一种可行的解决方法。

答案 1 :(得分:5)

抛出RuntimeException