抛出什么例外?

时间:2010-09-27 22:12:41

标签: java exception

我有一个函数来计算作为参数传递的列表的平均值。我想知道当我尝试计算大小为0的列表的平均值时,我应该抛出哪个Java异常。

public double mean (MyLinkedList<? extends Number> list)
{
    if (list.isEmpty())
        throw new ????????; //If I am not mistaken Java has some defined exception for this case

    //code goes here
}

感谢。

8 个答案:

答案 0 :(得分:26)

您可以抛出new IllegalArgumentException()

  

抛出以表明方法已被传递为非法或不恰当的参数。

请不要忘记传递明确的信息作为第一个参数。这将真正帮助您了解发生的事情。

例如“不能在空列表中使用均值”。

答案 1 :(得分:8)

首先要问自己的问题是,你是否应该投掷,然后,如果是的话,是否应该是经过检查或未经检查的例外。

不幸的是,在决定这些事情方面没有行业最佳实践,如StackOverflow答案所示:

In Java, when should I create a checked exception, and when should it be a runtime exception?

然而,有一些关键的考虑因素:

  • 您的设计/愿景如何使用此方法(使用0大小列表调用方法是否合理/正常)?

  • 与班级/包中的其他方法保持一致

  • 符合您的适用编码标准(如果有)

我的意见:

  • 返回Double.NAN或0 如果使用0大小的列表调用方法是合理的/预期的/正常的,我会考虑返回Double.NAN或{ {1}}如果0适合您的问题域。

  • 抛出0 如果我的设计说检查空列表是调用者的强烈责任,并且该方法的文档将清楚地说明它是调用者的责任,然后我会使用未经检查的标准IllegalArgumentException

  • 抛出自定义检查的异常如果该方法是统计包或库的一部分,其中有几个统计函数需要处理可能的空数据集,我认为这是一个异常条件是问题域的一部分。我将创建一个自定义(可能已检查)的异常(例如IllegalArgumentException)作为类/包/库的一部分,并在所有适用的方法中使用它。将其作为已检查的异常有助于提醒客户考虑如何处理该情况。

答案 2 :(得分:3)

您应该创建一个扩展Exception的新类,并提供特定于您的错误的详细信息。例如,您可以创建一个名为EmptyListException的类,其中包含有关错误的详细信息。这个可以是一个非常简单的异常类,它不带构造函数参数,但可能调用super("Cannot generate mean for an empty list");来向堆栈跟踪提供自定义消息。

很多时候这个做得还不够......我最讨厌的代码之一就是当开发人员使用泛型异常(甚至有时是Exception本身)并将字符串消息传递给构造函数时。这样做是有效的,但是使那些实现代码的人的工作变得更加困难,因为他们必须捕获一般异常,而实际上只会发生一些事情。异常应该与用于数据的对象具有相同的层次结构,每个级别提供更具体的详细信息。异常类越详细,堆栈跟踪就越详细和有用。

我发现这个网站:Exceptional Strategies在为我的应用程序创建例外时非常有用。

答案 3 :(得分:2)

抛出:IllegalArgumentException

答案 4 :(得分:2)

NoSuchElementException怎么样?虽然IllegalArgumentException可能更好。

答案 5 :(得分:1)

ArithmeticException如何 - 与运行时抛出相同。

答案 6 :(得分:1)

您目前是否正在抛出任何其他异常(或计划?)前面提到的任何异常都没问题,或者只是创建自己的异常。最重要的是传播出错的信息。

如果异常的'捕手'有可能重新抛出它,那么你可能想要调查任何其他例外,“捕手”也可能抛出。

答案 7 :(得分:1)

我不相信你应该在那里抛出一个例外; “没有”的平均值是“无”或0如果你愿意。如果集合为空,则只需返回0。

如果你真的必须抛出异常,那么IllegalStateException或IllegalArgumentException是你最好的选择。