我试图将一个自定义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,例如IllegalArgumentException或IndexOutOfBoundsException在某些情况下可能更合适).
这将允许您根据需要编译代码,但请注意,选择checked和unchecked异常之间的选择不应过于轻松.对于许多人来说,这是一个有争议的问题,除了让代码以您想要的方式编译之外,还有许多因素需要考虑.您可能需要考虑重新设计interface而不是让实现者抛出interface合同未指定的各种未记录的未经检查的异常.
覆盖或隐藏另一个方法的方法(包括实现
abstract接口中定义的方法的方法)可能不会被声明为throw被覆盖或隐藏方法的更多检查异常.
如果重新设计是不可能的,那么将您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);
}
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)
需要重申的是,这通常不是一种值得推荐的技术.如果可能的话,您应该在设计级别解决问题,但除此之外,这确实是一种可能的解决方法.