我正在尝试将自定义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()) ;
}
}
};
}
知道如何抛出我的自定义异常吗?
答案 0 :(得分:12)
有两种类型的例外,已检查和未选中。任何Throwable
都是其中之一。
已检查例外的示例是IOException
;可能最有名的未经检查的例外是NullPointerException
。
方法throw
必须在其throws
子句中声明的任何已检查异常。当你@Override
一个方法(实现interface
方法或覆盖超类中的继承方法)时,必须满足某些要求,其中之一就是throws
子句不能引起冲突简单来说,子类/实现可以抛出 LESS ,而不是 MORE 检查异常。
未经检查的异常定义为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);
}
如果你坚持,你可以做以下事情:
// 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
。