- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为什么使用 initCause
调用 ExceptionInInitializerError
会产生 IllegalStateException
?
public class Test {
public static final void main(String[] ignored) {
try {
ExceptionInInitializerError err = new ExceptionInInitializerError("1. Fail!");
err.initCause(new NullPointerException("null!"));
throw err;
} catch(Exception x) {
x.printStackTrace();
}
System.out.println();
try {
IllegalStateException isx = new IllegalStateException("2. Fail!");
isx.initCause(new NullPointerException("null!"));
throw isx;
} catch(Exception x) {
x.printStackTrace();
}
System.out.println();
try {
throw new IllegalStateException("3. Fail!", new NullPointerException("null!"));
} catch(Exception x) {
x.printStackTrace();
}
}
}
输出:
java.lang.IllegalStateException: Can't overwrite cause with java.lang.NullPointerException: null!
at java.lang.Throwable.initCause(Throwable.java:456)
at Test.main(Test.java:5)
Caused by: java.lang.ExceptionInInitializerError: 1. Fail!
at Test.main(Test.java:4)
java.lang.IllegalStateException: 2. Fail!
at Test.main(Test.java:14)
Caused by: java.lang.NullPointerException: null!
at Test.main(Test.java:15)
java.lang.IllegalStateException: 3. Fail!
at Test.main(Test.java:24)
Caused by: java.lang.NullPointerException: null!
... 1 more
我在文档中没有看到任何关于构造函数或类本身的内容,要么说(a)不允许,要么(b)为什么不允许。我确实在 JavaDoc 中看到了 "There is no saved throwable object."
,但是,对我来说,这意味着可以设置一个。
这是“只是因为”,还是有其他原因导致您无法设置 ExceptionInInitializerError
的原因?
最佳答案
当我研究这个问题时,我正在查看ExceptionInInitializerError
的源代码。
首先,class JavaDoc中有这个:
As of release 1.4, this exception has been retrofitted to conform to the general purpose exception-chaining mechanism. The "saved throwable object" that may be provided at construction time and accessed via the getException() method is now known as the cause, and may be accessed via the Throwable.getCause() method, as well as the aforementioned "legacy method."
没有任何关于“不要使用initCause
”的内容,但这似乎是您将得到的最接近的结果。
constructors明确地使这成为不可能,并且内部注释比 JavaDoc 中的任何内容都清晰得多(只说“没有保存的可抛出对象”):
/**
<P>... There is no saved throwable object.</P>
**/
public ExceptionInInitializerError() {
initCause(null); // Disallow subsequent initCause
}
public ExceptionInInitializerError(Throwable thrown) {
initCause(null); // Disallow subsequent initCause
this.exception = thrown;
}
public ExceptionInInitializerError(String s) {
super(s);
initCause(null); // Disallow subsequent initCause
}
不太明白真正的原因,但它似乎是无法改造的遗留代码和“只是因为”的混合体。
关于java - 为什么不能使用 ExceptionInInitializerError 调用 initCause ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24599884/
我不明白为什么我不能在创建实例或抛出异常的同一行中使用initCause()。如果我把它放在同一行,编译器会认为该方法必须抛出一个可抛出对象。 // All exceptions in the exa
我有这样的来源: Exception e = new Exception("Exception"); IOException ioE = new IOException("An exc
本文整理了Java中weka.core.WekaException.initCause()方法的一些代码示例,展示了WekaException.initCause()的具体用法。这些代码示例主要来源于
为什么使用 initCause 调用 ExceptionInInitializerError 会产生 IllegalStateException ? public class Test { p
本文整理了Java中java.util.zip.ZipException.initCause()方法的一些代码示例,展示了ZipException.initCause()的具体用法。这些代码示例主要来
在使用网络界面对我大喊大叫之前,请注意,我正在编写一个 MySQL 客户端应用程序,而不是一个尝试直接访问私有(private)公共(public)数据库的惰性应用程序。 我已将 mysql-conn
为什么我们只能对 Throwable/Exception 对象调用一次 Throwable.initCause() ? 为什么如果原因异常是由构造函数设置的,那么我们不能使用 initCause()
为什么我们只能对 Throwable/Exception 对象调用一次 Throwable.initCause() ? 为什么如果原因异常是由构造函数设置的,那么我们不能使用 initCause()
我是一名优秀的程序员,十分优秀!