当期望只有一个值但存在很多值时抛出什么内置异常

时间:2012-05-21 17:27:45

标签: java exception

我想在一个期望列表只有一个元素的方法中抛出异常,如果列表有多个,我想抛出异常。我试图确定是否有适当的现有Java异常抛出这种情况。我试着在列表中here进行观察,但没有看到任何跳出正确的内容。

在这种情况下,我调用一个对象的方法,期望该方法引用所述列表作为对象的属性。所以我实际上并没有传递数组,也没有传递索引作为参数。

(编辑以供澄清)

5 个答案:

答案 0 :(得分:4)

由于您试图暗示给定输入不是有效输入,因此您应该使用IllegalArgumentException并显示相同原因的消息。

throw new IllegalArgumentException("Input specified has more elements then expected");

否则你可以拥有自己的唯一定义条件的Exception

虽然我觉得因为它的元素数量是异常的原因,你甚至可以使用IndexOutOfBoundsException,这在给定的场景中是有意义的。

throw new IndexOutOfBoundsException("Expected size is 1, submitted input has size " + list.size());

编辑:根据评论

鉴于该列表不是方法调用的一部分,但属于调用其方法的对象,在这种情况下,list.size() > 1表示该对象未处于正确状态,并且具有{{1}的自定义版本或IllegalStateException本身带有正确的错误信息会更合适。

答案 1 :(得分:3)

你可以制作自己的例外并扔掉它。

public MyException extends Exception {
}

if(list.size() > 1) {
    throw new MyException("Expected only 1 element, found: " + list.size());
}

答案 2 :(得分:1)

如果列表是您正在调用该方法的对象的字段,那么您可以说具有错误大小的列表的对象处于错误状态,因此IllegalStateException将适当的。

但实际上,您应该使用标量字段替换列表(List<Foo>变为Foo),这样就不会出现这种情况。

答案 3 :(得分:0)

你可以在这样的方法中抛出错误

public void someMethod(List<MyClass> myList) throws NullPointerException, IllegalArgumentException {
    if (myList == null)
        throw new NullPointerException("myList parameter can't be null");
    if (myList.size() > 1) {
        throw new IllegalArgumentException("myList parameter must contain only 1 parameter");
    }
    //your code here...
}

最好在属性文件中设置错误消息,这样您只需更改配置即可显示新消息,无需通过修改代码重写错误消息。

答案 4 :(得分:0)

我不确定我是否理解用例,所以这个答案可能不合适,但我建议使用AssertionError

List < T > answers ; // expection a list of size one
assert 1 == list . size ( ) : "The programmer expects that there will be one and only one answer"
/*
In development:  assertions enabled,
 If there are zero answers, the program will crash on the assertion.
 If there are multiple answers, the program will crash on the assertion.
 Only if there is exactly one answer will it proceed to the below line (and work correctly).
In production:  assertions disbled,
 If there are zero answers, the program will throw a RuntimeException on the below line.
 If there are multiple answers, the program will proceed to the below line (and appear to work).
 If there is only one answer, the program will proceed to the below line and wok correctly.
*/
T answer = answers . get ( 0 ) ;

此方法优于使用ifswitch

的优点
  1. 某些代码覆盖工具会要求您为分支编写单元测试。
  2. 分支增加了圈复杂度。
  3. 仅在开发期间才会执行评估