IllegalStateException是否适用于不可变对象?

fin*_*nnw 6 java exception

你会扔一个IllegalStateExceptionif:

  1. 由于一个或多个字段的值,方法无法完成其工作
  2. 那些字段final只在构造函数中分配?

教科书示例:您的类是不可变的Collection<BigInteger>,您的方法应该返回最大元素,但此实例为空.

我已经阅读了关于这个主题的Kevin Bourillon博客文章,我不确定适用哪条规则.

UnsupportedOperationException - 这意味着无论实例的构造方式如何,对于此类的实例(具体类型),调用的方法始终会失败.

当然不.此类的许多实例都不为空,操作也会成功.

IllegalStateException - ...确实存在至少一个有问题的实例可能已进入的备用状态,它将通过检查... <snip> ...另请注意,此异常是否合适,无论它是否合适实际上可能会改变实例状态的这个方面,或者已经太晚了.

不完全的.这个实例是用零长度构造的,所以这个实例不是,也永远不会是非空的.

IllegalArgumentException - 抛出此异常意味着此参数至少存在一个其他值,该值将导致问题检查通过.

如果有问题的参数是隐式this参数,则可以应用.这是我很想抛出的例外,但我担心它可能会令人困惑.


更新:将示例更改为Collection<Integer>,Collection<BigInteger>因为存在标识元素(Integer.MIN_VALUE)的事实会分散问题.

Jon*_*Jon 11

它听起来不像上面提到的任何常见异常类适合Textbook示例.

你应该抛出一个NoSuchElementException正如该Collections.max()方法所做的那样.

  • Arrgghh!返回-1表示应该返回最大值的方法?Arrgghhhh! (6认同)
  • +1到NoSuchElementException,但是`return -1`是一个坏主意.那么返回`Integer.MIN_VALUE`,如果返回它仍然不会告诉你实际上是否存在最大值(那么仅包含Integer.MIN_VALUE的集合呢?Null是一个比两者都更好的选择但是不如例外IMO. (5认同)

Eri*_*lje 4

我认为IllegalStateException放在这里是合适的。如果实例构造正确的话,它可能处于正确的状态(即“已经太晚了”部分)。

  • 在这种情况下,它应该是非法参数异常,但是**当**您意识到对象的构造不正确时。 (2认同)
  • ILM 嗯,是的,你说得对,但在这种情况下,我宁愿使用`UnsupportedOperationException`,但这很棘手..mmmhh 那又怎样呢.. `UnsopporteOperationCausedByIllegalStateOriginatedByIllegalArgumentException` :) (2认同)