java - IllegalStateException 与 UnsupportedOperationException

标签 java illegalstateexception

我对使用异常感到困惑:IllegalStateExceptionUnsupportedOperationException

我有一个删除方法,在某些情况下不允许使用:假设调用者有有效数据。

然后我应该给用户一个异常信息,告诉他他现在正在做一个无效的操作。

那么,我应该抛出哪个异常? IllegalStateExceptionUnsupportedOperationException

我知道我可以使用它们中的任何一个来给出详细信息,但我仍然想知道哪个对我来说更好。

来自 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/

相关文章:

java - 将方法放入数组中

java - Java 8 并行流中的自定义线程池

Java Web 服务 HttpServletRequestWrapper 问题 : IllegalStateException

android - 在 onLongClickListener 中调用 MediaRecorder.start 时在 android.media.MediaRecorder.start 处出现 java.lang.IllegalStateException

java - 从 JSON 中提取字节数组

java - Worklight 6.2 wlapp 部署给出错误 java 堆空间

java - JSoup 不会获取所有项目?

java - "java.lang.IllegalStateException: Activity has been destroyed"当按下 onBackPressed() 时

java - Android,在应用程序中显示 JSON 数据