什么时候抛出RuntimeException?

时间:2016-02-21 19:33:26

标签: java android

我正在为Android开发一个库,我打算开源,当然我想在发布之前勾选所有方框 - 所以用户对我的代码印象深刻。咳。

与许多库一样,为了使库能够运行,还需要一些基本配置。

public static final String API_KEY = "your_api_key_here";

在上面的例子中,当用户将他们的API密钥传递给库时,我正在为“ your_api_key_here ”添加一个简单的字符串匹配,如果匹配,我将要抛出一个RuntimeException,因为他们根本没有阅读基本说明,我希望他们的应用程序死掉。

这是否有效使用RuntimeException?如果不是,那么在 Java 是什么?

编辑 - 我发布此帖子的动机是due to this post,其中OP被“ why!?”的呐喊私刑用于询问如何投掷一个

答案 - 在这种情况下,它似乎更倾向于偏好而不是对或错 - 至少目前为止没有人反对过。此方案应仅在开发人员的测试阶段发生,而不会在生产中发生。如果情况并非如此,我就不会选择未被捕获的例外。

我已经将答案标记为正确,因为最受欢迎,并且在下面的@mech评论之后,我创建了一个自定义 ReadTheDocumentationException ,它提供了一个具有适当说服力的消息。

3 个答案:

答案 0 :(得分:7)

我认为你应该使用非法的参数异常,它是java.lang.RuntimeException的子类。你可以做这样的事情

if(API_KEY.equals("your_api_key_here"))
    throw new IllegalArgumentException("you message here");

有关详细信息,请参阅this

答案 1 :(得分:3)

您应该通过扩展RuntimeException或任何其他Exception来创建自己的异常。 IllegalStateException适用于某人非常行为不端的情况。

答案 2 :(得分:2)

听起来你的问题的一部分涉及RuntimeException的正确使用,并且部分处理了如果配置错误你的库应该如何表现。我将主要处理前者。

在Java中,有两种类型的例外,选中和未选中。

RuntimeException及其所有子类都是“未经检查”的异常,这意味着编译器无需捕获它们。如果出现问题,您可以使用这些来破坏您的流程。调用者仍然可以自己捕获并处理它们,因此请准备好调用者可能继续错误地调用你的lib。

异常及其所有子类(RuntimeException除外)都被“检查”,这意味着编译器需要调用者捕获它们或在方法声明中声明它可能被抛出。如果您希望调用者尝试从任何条件中恢复而导致抛出异常,则使用此方法。

在您的情况下,您可以使用有意义的消息或RuntimeException的自定义子类抛出RuntimeException,并带有一条消息,指示调用方确切地指出了哪些错误以及如何解决它。你选择的并不重要,但许多人为了清晰起见选择了子类。我只是确保异常永远不会让人惊讶,以便为你的lib提供明确的参与规则。