我有一个函数来计算作为参数传递的列表的平均值。我想知道当我尝试计算大小为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
}
感谢。
答案 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是你最好的选择。