- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
这是在今天与一位同事的讨论中提出的。
Java 的 IllegalStateException
的 Javadocs声明它:
Signals that a method has been invoked at an illegal or inappropriate time. In other words, the Java environment or Java application is not in an appropriate state for the requested operation.
Effective Java 说(第 60 条,第 248 页):
Another commonly reused exception is IllegalStateException. This is generally the exception to throw if the invocation is illegal because of the state of the receiving object. For example, this would be the exception to throw if the caller attempted to use some object before it had been properly initialized.
这里似乎有些出入。 javadocs的第二句话听起来像是异常可以描述有关Java执行状态的非常广泛的条件,但Effective Java中的描述使它听起来像是用于专门与对象状态相关的条件方法已被调用。
我在 JDK(例如集合,Matcher
)和 Guava 中看到的用法似乎肯定属于 Effective Java 所谈论的类别(“这个对象处于方法不能被调用”)。这似乎也与 IllegalStateException
的兄弟 IllegalArgumentException
一致。
JDK 中是否存在与“Java 环境”或“Java 应用程序”相关的合法 IllegalStateException
用法?或者是否有任何最佳实践指南提倡将其用于更广泛的执行状态?如果不是,那为什么 javadocs 会这样写呢? ;)
最佳答案
这是 JDK 中此异常的一种特别合法的用法(请参阅:URLConnection.setIfModifiedSince(long)
以及它的 300 多种其他用法:
public void setIfModifiedSince(long ifmodifiedsince) {
if (connected)
throw new IllegalStateException("Already connected");
ifModifiedSince = ifmodifiedsince;
}
我认为这个例子很清楚。如果对象处于特定状态(“已连接”),则不应调用某些操作。在这种情况下,建立连接时,某些属性无法设置。
当您的类的某些状态(状态机?)会随着时间而改变,从而使某些方法变得不相关或不可能时,此异常特别有用。考虑一个具有 start()
、stop()
和 fuel()
方法的 Car
类。虽然调用 start()
两次,一次又一次,可能没有错,但给启动的汽车加油肯定是个坏主意。即 - 汽车处于错误状态。
可以说好的 API 不应该允许我们调用处于错误状态的方法,以便在编译时而不是在运行时发现类似的问题。在此特定示例中,连接到 URL 应返回带有方法子集的不同对象,所有方法在连接后均有效。
关于java - IllegalStateException 的预期用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12698275/
我对java有点陌生,所以如果我犯了一个简单的错误,请原谅我,但我不确定我哪里出错了,我收到的错误是“预期的.class,预期的标识符,而不是声明, ';'预期的。”我尝试了不同的方法,并从这些方法中
This question already has answers here: chai test array equality doesn't work as expected (3个答案) 3年前
我正在学习 Java(对不起,我的英语很差,这不是我的母语),当我在 Eclipse (JavaSE-1.7) 中在我输入的每个“try”中执行“try-finally” block 时,会出现以下消
我收到两个错误,指出 token 上的语法错误,ConstructorHeaderName expected instead & token “(”上的语法错误,< expected 在线: mTM.
我找不到错误。 Eclipse 给我这个错误。每个 { } 都是匹配的。请帮忙。 Multiple markers at this line - Syntax error on token “)”,
代码: import java.awt.*; import javax.swing.*; import java.awt.event.*; public class DoubleIt extends
我正在用 python(Vs 代码)编写代码,但出现此错误: Expected ")" Pylance 错误发生在:def main() 我试着运行我的 main 并将它打印到我的屏幕上。我用谷歌搜
我正在尝试按照 documentation 中的建议使用异步函数。但我收到此错误 意外的 token ,预期 ( async function getMoviesFromApi() { try
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
第一行包含一个表示数组长度的整数p。第二行包含用空格分隔的整数,这些整数描述数组中的每个元素。第三行打印一个整数,指示负数组的数量。 package asgn3; import java.util.*
好的,我是初学者,我必须修复此 java 表达式语言代码才能在我的系统 (Windchill) 中工作,但看起来我在语法中遗漏了一些内容: LWCNormalizedObject lwc =
我无法编译我的程序! 我想我缺少一个花括号,但我怎么也看不出在哪里! import javax.swing.*; import java.awt.*;
我的 jQuery 代码有问题,我的 Firebug 向我发出警告:需要选择器。 这是代码: $("img[id$='_tick']").each(function() { $(this).c
我的新类(class) Fountainofyouth 遇到了问题。尝试构建整个项目后,调试器显示 warning: extended initializer lists only available
我已经从 Java 转向 CPP,并且正在努力围绕构造构造函数链进行思考,我认为这是我的问题的根源。 我的头文件如下: public: GuidedTour(); GuidedTour(string
鉴于以下 for(var i=0; i< data.cats.length; i++) list += buildCategories(data.cats[i]); jsLint 告诉我 Expect
我有这个 json,但 Visual Studio Code 在标题中给了我警告。 [ { "title": "Book A", "imageUrl": "https:
我正在尝试编写一个有条件地禁用四个特殊成员函数(复制构造、移动构造、复制赋值和移动赋值)的包装类,下面是我用于测试目的的快速草稿: enum class special_member : uint8_
所以我用 F# 编写了一个非常简单的程序,它应该对 1000 以下的所有 3 和 5 的倍数求和: [1..999] |> List.filter (fun x -> x % 3 = 0 || x %
我是一名优秀的程序员,十分优秀!