当前位置: 首页 > 知识库问答 >
问题:

IllegalStateException与UnsupportedOperationException

锺离刚洁
2023-03-14

我对使用异常感到困惑: IllegalStateExcture vs Unsupport tedoperationExcture。

我有一个delete方法,在某些情况下是不允许使用的:比方说,当调用方拥有有效数据时。

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

那么,我应该抛出哪个例外?IllegalStateExcema或Unsupport tedoperationExc农田。

我知道我可以使用其中任何一个来给出详细信息,但我仍然想知道哪一个更适合我的情况。

从JavaDoc:

  • 非法国家例外:

表示方法已在非法或不适当的时间被调用。换句话说,Java环境或Java应用程序不处于用于所请求操作的适当状态。

  • 不支持操作异常:

抛出以指示不支持请求的操作。

共有2个答案

邴越彬
2023-03-14

IllegalStateException:此方法不太常见,但很有用。方法依赖于以前调用的方法。

例如,如果您的对象要求在调用其他方法之前先调用其initialise()方法,则可以在initialise()内设置一个标志,并在尚未调用initialise()时引发IllegalStateException:

private boolean initted;

public void initialise() {
  // ...
  initted = true;
}
public void doSomething() {
  if (!initted)
    throw new IllegalStateException("Object not initialised");
}

UnsupportedOperationException:此异常用于重写抽象类或实现接口,但不希望或无法实现某些方法的情况。

Java集合框架的各个类都使用它。理想情况下,您的接口或方法还应该为调用方提供一种方法,以便提前确定它是否希望支持给定的操作。

麻桐
2023-03-14

当该方法完全不受支持时,应该使用Unsupport tedoperationExc0019,而当该方法受到支持时,应该使用IllegalStateExc0019,但在当前状态下,它是不合法的。

Iterator类很好地说明了这两个异常之间的区别。

迭代器通过抛出不支持操作异常,在默认方法中实现remove()

public interface Iterator<E> {
    ...
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
    ...
}

如果实现不重写此方法以支持此方法,则该方法确实永远不受支持。

关于实现,我们可以看到ArrayList类使用的Iterator实现覆盖了remove()以支持它。因此不再抛出UnsupportedOperationException

另一方面,我们还可以看到,如果您在从未调用next()以使迭代器前进到下一个元素时调用该方法,则该方法会抛出IllegalStateException

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

 类似资料:
  • 让我们从Javadocs开始: 非法国家例外 表示在非法或不适当的时间调用了方法。换句话说,Java环境或Java应用程序对于请求的操作没有处于适当的状态。 异常 抛出以指示方法已传递非法或不适当的参数。 上面的问题是,它们非常黑白分明。考虑一个用例,其中方法正在解析调用方提供的文件。该文件存在、可读且格式正确。但是,文件中的某些内容不符合业务规则。在这种情况下,什么是合适的异常抛出-或? 看看提

  • 我正在我的应用程序中使用CameraX API。我已经将预览用例和ImageAnalysis用例绑定到活动生命周期,如 该应用程序大部分时间都可以工作,但会随机崩溃以下日志 2020-01-17 11:24:47.411 6581-6614/com。我的应用程序D/摄像头:重置捕获会话 2020-01-17 11:24:47.411 6581-6614/com.my.appD/相机:关闭状态下的释

  • 我试图从我的主屏幕打开一个新窗口,我一直得到IllegalStateException,我对JavaFx真的很陌生,我仍然不太了解FXMLLoader是如何工作的 这是我的方法 这是异常错误:

  • 我尝试使用以下< code>ViewTreeObserver获取< code >片段中< code>ImageView的高度和宽度: 运行此代码会导致以下异常: 文档说 已被弃用,但是如果我按照建议使用 ,我会收到一个未定义的错误。 我做错了什么?

  • 我还使用了notifyItemChanged(),同样的异常。有什么秘密的更新方式来通知适配器有什么变化?

  • 谁能帮帮我吗?我使用JQuery$.getJSON()根据选定的下拉列表(category)加载一个下拉列表(subcategories)的内容。 由于某种原因我得到了一个IllegalStateException。提前谢谢你。