我对使用异常感到困惑: IllegalStateExcture vs Unsupport tedoperationExcture。
我有一个delete方法,在某些情况下是不允许使用的:比方说,当调用方拥有有效数据时。
然后我应该给用户一个异常信息,他现在正在做一个无效的操作。
那么,我应该抛出哪个例外?IllegalStateExcema或Unsupport tedoperationExc农田。
我知道我可以使用其中任何一个来给出详细信息,但我仍然想知道哪一个更适合我的情况。
从JavaDoc:
表示方法已在非法或不适当的时间被调用。换句话说,Java环境或Java应用程序不处于用于所请求操作的适当状态。
抛出以指示不支持请求的操作。
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集合框架的各个类都使用它。理想情况下,您的接口或方法还应该为调用方提供一种方法,以便提前确定它是否希望支持给定的操作。
当该方法完全不受支持时,应该使用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。提前谢谢你。