一个不抛出异常的基类的调用方法是否可以抛出Java异常?

3
这可能是一个关于Java异常处理的荒谬问题,但我有一个UI actor(即Android Activity),它正在从我的ContentProvider子类中请求服务。子类希望在SD卡已满、SD卡丢失、网络I/O错误等情况下抛出一些异常。然而,当我编写CP子类来抛出我的异常时,编译器会建议将异常添加到CP类中。显然,我不想修改基类,但我希望UI能够捕获子类的异常。
有道理吗?这可行吗?如果不行,有没有更好的模式让我的服务子类将可抛出对象返回给UI?
3个回答

8

您可以抛出未经检查的异常,而无需将其添加到方法的原型中。

未经检查的异常是任何继承自RuntimeException的异常。这是您想要做的吗?


是的,那就是我想要的。实际上,在等待答案的时候,我已经开始编写它作为我的“解决方法”,但由于我得到了三个快速的回复,现在我知道这不是一个解决方法,而是正确的解决方案。 - mobibob

6

您可以抛出RuntimeException的子类实例,这些实例不会被编译器检查。

然而,空的异常规范是基类方法契约的一部分。为了使子类实例能够在使用超类类型的任何代码中使用,满足契约是理想的。(这被称为里氏替换原则。)


1
+1 是因为你是唯一一个注意到需要遵循基类契约的人。 - Nikita Rybak
那很有道理。虽然我不完全知道需要编写什么,但我同意适当扩展方法,使得我的类成为一个“有效”的子类。我会研究这个的。 - mobibob

3

您只需要声明并捕获“受检异常”。您不需要声明或显式捕获RuntimeException。因此,您可以在层次结构中任何位置抛出RuntimeException并捕获它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接