【问题标题】:Java Type of Exception to Throw要抛出的 Java 类型的异常
【发布时间】:2017-01-10 16:34:50
【问题描述】:

我试图了解为什么要抛出某些异常。我选择扔哪一个有什么关系?

例如

//simple division method - a/b
public static double divide(double a, double b){
    if(b == 0)
        throw new IllegalArgumentException("b = 0");
    return a/b;
}

对

//simple division method - a/b
public static double divide(double a, double b){
    if(b == 0)
        throw new IllegalArithmeticException("b = 0");
    return a/b;
}

(如果代码中有错误,我深表歉意 - 我很快就把它放在一起。我实际上对方法本身并不感兴趣。)

我选择哪个例外有关系吗?它似乎可以是任何东西 - 即使我使用了 arrayIndexOutOfBoundsException,它仍然会停止程序并打印我想要它打印的内容。

感谢您的帮助。

【问题讨论】:

  • 有人使用您的代码并获得ArrayIndexOutOfBoundsException。他们会猜到问题是什么?
  • 明白了,但是在 IllegalArithmeticException 和 IllegalArgumentException 的情况下,除了名称之外还有其他理由选择一个吗?

标签: java exception exception-handling throw


【解决方案1】:

值得讨论检查异常和未检查异常之间的区别是什么,以确定抛出什么异常的关键点。

假设您正在尝试读取文件,但无论出于何种原因,都找不到该文件。 Java 有一个方便的FileNotFoundException,您可以使用它来明确通知找不到文件。它也是扩展(通过其层次结构)Exception 的异常之一,这意味着如果一个方法声明此异常被抛出,它必须通过捕获它或将其声明为扔到别处。

然后是ArithmeticException,它是一个运行时异常(它扩展了RuntimeException)——没有方法需要声明它被抛出,你也不需要显式地捕获它,因为这类异常指示代码中的错误。它可能会出现,实际上,如果有任何东西试图捕获运行时异常,它看起来有点可疑。

在您的问题的上下文中,您基本上是通过预先警告用户有效输入来踩踏ArithmeticException 的自然投掷。做这样的事情可能是可以接受的,但在这种情况下,你实际上不需要自己扔任何东西。如果有人决定将 b = 0 传递给方法,他们会得到 @ 987654327@.

存在基于异常的现有约定 - 尽可能具体地说明问题,并在适当的情况下提供恢复方法 - 因此在这种情况下,如果您不得不抛出特定的例外,我推荐IllegalArgumentException,因为在除法或取模时参数b = 0 是不可接受的。但是,我还建议将其捕获在此方法之外的方法 中,因为输入确实很可疑,并且在进入此方法之前最好对其进行清理。

【讨论】:

    【解决方案2】:

    嗯,从公司的角度来看,抛出什么异常并不重要。因为从技术上讲,您为用户创建程序来处理它,如果用户输入了不需要的输入,那么他/她将能够了解他/她所犯的错误。 它可以作为用户纠正错误的注释。

    【讨论】:

      猜你喜欢
      • 2011-02-07
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多