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

ray*_*man 4 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()) ;
            }
        }


    };

}
Run Code Online (Sandbox Code Playgroud)

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

pol*_*nts 12

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

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

任何已检查的异常,throw必须在其throws子句中声明方法.当您@Override使用方法(实现interface方法或覆盖超类中的继承方法)时,必须满足某些要求,其中之一是该throws子句不得导致冲突.简单地说,子类/实现可以抛出LESS,而不是更多的已检查异常.

一个未经检查的异常被定义为RuntimeException和它的子类,并Error和它的子类.它们不必在方法的throws子句中声明.

因此,在这种特殊情况下,如果你想throw一个CustomException在的实现interface不列出它的方法中的throws条款,你可以做CustomException extends RuntimeException,使之选中.(它也可以是extends任何子类RuntimeException,例如IllegalArgumentExceptionIndexOutOfBoundsException在某些情况下可能更合适).

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

参考

相关问题

也可以看看

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

解决方法"解决方案"

如果重新设计是不可能的,那么将您CustomExceptionRuntimeException(或其子类)包装起来将"起作用".也就是说,而不是:

// ideal solution, not possible without redesign

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

//...
try {
    someMethod();
} catch (CustomException e) {
    handleCustomException(e);
}
Run Code Online (Sandbox Code Playgroud)

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

// 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
    }

}
Run Code Online (Sandbox Code Playgroud)

需要重申的是,这通常不是一种值得推荐的技术.如果可能的话,您应该在设计级别解决问题,但除此之外,这确实是一种可能的解决方法.


Ido*_*ein 5

扔一个RuntimeException.