当前位置: 首页 > 知识库问答 >
问题:

什么时候应该抛出IllegalArgumentException?

吉岳
2023-03-14

我担心这是一个运行时异常,所以应该谨慎使用。
标准用例:

void setPercentage(int pct) {
    if( pct < 0 || pct > 100) {
         throw new IllegalArgumentException("bad percent");
     }
}

但这似乎会迫使以下设计:

public void computeScore() throws MyPackageException {
      try {
          setPercentage(userInputPercent);
      }
      catch(IllegalArgumentException exc){
           throw new MyPackageException(exc);
      }
 }

将其恢复为检查异常。

好吧,但我们还是继续吧。如果输入错误,则会出现运行时错误。因此,首先,这实际上是一个很难统一实施的政策,因为您可能需要进行相反的转换:

public void scanEmail(String emailStr, InputStream mime) {
    try {
        EmailAddress parsedAddress = EmailUtil.parse(emailStr);
    }
    catch(ParseException exc){
        throw new IllegalArgumentException("bad email", exc);
    }
}

更糟糕的是,在检查0时

所以基本上我要说的是,我没有看到使用IllegalArgumentExc0019的有意义的一致策略。似乎不应该使用它,我们应该坚持我们自己检查的异常。抛出这个的好用例是什么?


共有3个答案

樊烨烨
2023-03-14

“谨慎地”抛出运行时异常并不是一个好策略——有效Java建议在合理预期调用方会恢复时使用检查的异常。(程序员错误是一个特定的例子:如果一个特定的情况表明程序员错误,那么你应该抛出一个未经检查的异常;你希望程序员有一个逻辑问题发生的堆栈跟踪,而不是试图自己处理它。)

如果没有恢复的希望,那么请随意使用未检查的异常;捕捉它们没有意义,所以这很好。

不过,从您的示例中还没有100%清楚这个示例在您的代码中是哪种情况。

邴姚石
2023-03-14

当谈到“坏输入”时,你应该考虑输入是从哪里来的。

如果输入是由用户或您不控制的另一个外部系统输入的,您应该期望输入无效,并始终验证它。在这种情况下,抛出一个选中的异常是完全可以的。您的应用程序应该通过向用户提供错误消息从该异常中恢复。

如果输入源于您自己的系统,例如您的数据库或应用程序的某些其他部分,则您应该能够依赖它来验证其有效性(它应该在到达之前经过验证)。在这种情况下,抛出未经检查的异常(如IllegalArgumentException)是完全可以的,它不应该被捕获(通常,您永远不应该捕获未经检查的异常)。这是一个程序员的错误,一开始就出现了无效值;)你需要修理它。

谷梁煌
2023-03-14

IllegalArgumentExc0019的API文档:

抛出以指示已向方法传递非法或不适当的参数

通过查看它在JDK库中的使用情况,我想说:

>

  • 这似乎是一种防御措施,在输入进入工作之前抱怨明显糟糕的输入,并导致一些东西在中途失败,发出荒谬的错误信息。

    它用于抛出检查过的异常(尽管它出现在java.lang.reflect代码中,但在其他情况下,对检查过的异常抛出的荒谬级别的担忧并不明显)太烦人的情况。

    我将使用IllegalArgumentExc0019对常见实用程序进行最后一道防御性参数检查(试图与JDK使用保持一致)。或者期望一个坏参数是程序员错误,类似于NullPointerExc0019。我不会用它来实现业务代码中的验证。我当然不会在电子邮件示例中使用它。

  •  类似资料:
    • 问题内容: 我担心这是运行时异常,因此应谨慎使用。 标准用例: 但这似乎会强制执行以下设计: 使它回到被检查的异常。 好的,但是让我们开始吧。如果输入错误,则会出现运行时错误。首先,这实际上是统一实施的相当困难的策略,因为您可能必须执行相反的转换: 更糟的是-虽然可以预期客户端代码将以静态方式进行检查,但对于更高级的数据(例如电子邮件地址)却并非如此,或更糟糕的是,必须对数据库进行检查,因此,一般

    • 问题内容: 在我的应用程序中,有时会引发以下异常: 很难找到错误,因为在stacktrace中没有列出我的方法。那么,有人知道何时抛出此异常吗?感谢您的任何提示。 问题答案: 您可以在stacktrace中看到错误: 适配器的内容已更改,但ListView没有收到通知。确保不从后台线程修改适配器的内容,而仅从UI线程修改。 您应该调查一个线程,并使其与UI线程同步。 在Android中执行此操作的

    • 我们应该在什么时候选择抛出一个异常? 我们可以在try catch中捕获此异常。 在哪种情况下,我们选择使用投掷而不是立即接球?是否与设计模式相关?

    • 问题内容: 我知道他们两个都禁用了Nagle的算法。 我什么时候应该/不应该使用它们中的每一个? 问题答案: 首先,不是所有人都禁用Nagle的算法。 Nagle的算法用于减少有线中更多的小型网络数据包。该算法是:如果数据小于限制(通常是MSS),请等待直到收到先前发送的数据包的ACK,同时累积用户的数据。然后发送累积的数据。 这将对telnet等应用程序有所帮​​助。但是,在发送流数据时,等待A

    • 问题内容: 在该类中,有两个字符串,和。 有什么不同?我什么时候应该使用另一个? 问题答案: 如果你的意思是和则: 用于在文件路径列表中分隔各个文件路径。考虑在上的环境变量。您使用a分隔文件路径,因此在上将是;。 是或用于拆分到特定文件的路径。例如在上,或

    • 我已经用Java编写代码一段时间了。但有时,我不知道什么时候应该抛出异常,什么时候应该捕获异常。我正在做一个有很多方法的项目。层次结构是这样的- 所以目前我正在做的是-我在所有方法中抛出异常并在方法A中捕获它,然后将其记录为错误。 但我不确定这是否是正确的方法?或者我应该开始在所有方法中捕获异常。这就是为什么这种混乱始于我的 - 我什么时候应该抓住异常与何时应该抛出异常。我知道这是一个愚蠢的问题,