我对使用异常感到困惑:IllegalStateException 与 UnsupportedOperationException。
我有一个删除方法,在某些情况下不允许使用:假设调用者有有效数据。
然后我应该给用户一个异常信息,告诉他他现在正在做一个无效的操作。
那么,我应该抛出哪个异常? IllegalStateException 或 UnsupportedOperationException。
我知道我可以使用它们中的任何一个来给出详细信息,但我仍然想知道哪个对我来说更好。
来自 JavaDoc:
- 非法状态异常:
在非法或不适当的时间调用方法的信号。换句话说,Java 环境或 Java 应用程序未处于适合请求操作的状态。
- UnsupportedOperationException:
抛出表示不支持请求的操作。
最佳答案
UnsupportedOperationException
应该被使用,因为该方法根本不支持,而 IllegalStateException
应该被使用,因为该方法是受支持的,但是在目前的状态,这是不合法的。
Iterator
类是说明这两个异常之间差异的良好候选者。
Iterator
通过抛出 UnsupportedOperationException
在默认方法中实现 remove()
:
public interface Iterator<E> {
...
default void remove() {
throw new UnsupportedOperationException("remove");
}
...
}
如果不重写此方法来支持它,则该方法确实从不被实现支持。
关于实现,我们可以看到 ArrayList
使用的 Iterator
实现类覆盖 remove()
以支持它。所以 UnsupportedOperationException
不再抛出。
另一方面,我们还可以看到,如果您在从未调用 next()
使迭代器前进到下一个元素:
private class Itr implements Iterator<E> {
...
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
...
}
}
此实现非常支持该方法,但如果您在非法状态下调用它,则会抛出 IllegalStateException
。
关于java - IllegalStateException 与 UnsupportedOperationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49749786/