And*_*mee 74 java exception illegalstateexception
今天与同事讨论了这个问题.
爪哇的Javadocs IllegalStateException说它:
表示在非法或不适当的时间调用了方法.换句话说,Java环境或Java应用程序未处于所请求操作的适当状态.
而Effective Java则说(项目60,第248页):
另一个常用的异常是IllegalStateException.如果由于接收对象的状态而调用是非法的,则通常会抛出异常.例如,如果调用者在正确初始化之前尝试使用某个对象,则抛出此异常.
看来这里有一点差异.javadocs的第二句使得听起来像异常可以描述关于Java执行状态的非常宽泛的条件,但是Effective Java中的描述使得它听起来像是用于特定于与对象的状态状态相关的条件.方法已被调用.
我在JDK(例如集合Matcher)和Guava中看到的用法肯定似乎属于Effective Java谈论的类别("此对象处于无法调用此方法的状态").这也似乎与IllegalStateException兄弟姐妹一致IllegalArgumentException.
IllegalStateExceptionJDK中是否存在与"Java环境"或"Java应用程序"相关的合法用法?或者是否有任何最佳实践指南主张将其用于更广泛的执行状态?如果没有,为什么这样的javadocs就像那样?;)
Tom*_*icz 41
以下是JDK中此异常的一个特别合法的用法(参见:URLConnection.setIfModifiedSince(long)其中300多个用法:
public void setIfModifiedSince(long ifmodifiedsince) {
if (connected)
throw new IllegalStateException("Already connected");
ifModifiedSince = ifmodifiedsince;
}
Run Code Online (Sandbox Code Playgroud)
我认为这个例子很清楚.如果对象处于特定状态(" 已连接 "),则不应调用某些操作.在这种情况下,建立连接时,无法设置某些属性.
当您的类具有随时间变化的某些状态(状态机?)时,此异常特别有用,使某些方法无关紧要或不可能.想想一Car类具有start(),stop()和fuel()方法.虽然start()一个接一个地打电话两次,但可能没什么不对,但为一辆入门的车加油肯定是个坏主意.即 - 汽车处于错误状态.
可以说好的API不应该允许我们在错误的状态下调用方法,以便在编译时发现类似的问题,而不是在运行时.在此特定示例中,连接到URL应返回具有方法子集的不同对象,所有这些方法在连接后都有效.
这是JDK中的一个例子。有一个名为 java.lang.Shutdown 的包私有类。如果系统正在关闭并且您尝试添加新挂钩,则会引发 IllegalStateException。有人可能会争辩说,这符合“javadoc”指南的标准——因为 Java 环境处于错误状态。
class Shutdown {
...
/* Add a new shutdown hook. Checks the shutdown state and the hook itself,
* but does not do any security checks.
*/
static void add(int slot, Runnable hook) {
synchronized (lock) {
if (state > RUNNING)
throw new IllegalStateException("Shutdown in progress");
if (hooks[slot] != null)
throw new InternalError("Shutdown hook at slot " + slot + " already registered");
hooks[slot] = hook;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,它也说明了“javadoc”指南和“Effective Java”指南之间确实没有区别。由于 Shutdown 的实现方式,JVM 的关闭状态存储在称为 state 的字段中。因此,它也符合有关何时使用 IllegalStateException 的“Effective Java”指南,因为“state”字段是接收对象状态的一部分。由于接收对象 (Shutdown) 处于错误状态,因此它会抛出 IllegalStateException。
在我看来,关于何时使用 IllegalStateException 的两个描述是一致的。Effective Java 描述更实用一些,仅此而已。对于我们大多数人来说,整个 Java 环境中最重要的部分是我们现在正在编写的类,所以这就是作者所关注的。