Java &引用;Can';“不覆盖原因”;设置原因为空的异常的原因时
我有一个无原因的Java &引用;Can';“不覆盖原因”;设置原因为空的异常的原因时,java,exception,Java,Exception,我有一个无原因的RuntimeException(t.getCause()返回null)。当我的代码运行t.initCause(exceptionToAttach)时,它会给我一个IllegalStateException,并显示消息“无法覆盖原因” 我不认为这是可能的。exceptionToAttach只是一个新的RuntimeException(),出于某种原因,它似乎将自身设置为原因 知道发生了什么事吗 使用一些相关代码进行编辑 public static void addCause(Th
RuntimeException
(t.getCause()返回null
)。当我的代码运行t.initCause(exceptionToAttach)
时,它会给我一个IllegalStateException
,并显示消息“无法覆盖原因”
我不认为这是可能的。exceptionToAttach只是一个新的RuntimeException()
,出于某种原因,它似乎将自身设置为原因
知道发生了什么事吗
使用一些相关代码进行编辑
public static void addCause(Throwable e, Throwable exceptionToAttach) {
// eff it, java won't let me do this right - causes will appear backwards sometimes (ie the rethrow will look like it came before the cause)
Throwable c = e;
while(true) {
if(c.getCause() == null) {
break;
}
//else
c = c.getCause(); // get cause here will most likely return null : ( - which means I can't do what I wanted to do
}
c.initCause(exceptionToAttach);
}
导致非法状态异常的代码如下所示:
public class Throwable implements Serializable {
private Throwable cause = this;
public synchronized Throwable initCause(Throwable cause) {
if (this.cause != this)
throw new IllegalStateException("Can't overwrite cause");
if (cause == this)
throw new IllegalArgumentException("Self-causation not permitted");
this.cause = cause;
return this;
}
// ..
}
这意味着您不能调用构造函数public Throwable(字符串消息,Throwable原因)
,然后在同一实例上调用initCause
我认为您的代码调用了
public-Throwable(字符串消息,Throwable-cause)
,将null
作为cause
传递,然后尝试调用initCause
不允许的内容。尝试将您的问题隔离到SSCCE
(简短、自包含、正确(可编译),例如)。请参阅:getCause()
通常不返回null
。把密码贴出来,我想你错了,拉维。我发布了我的代码,它已经正常工作了大约一年半。如果你不初始化原因,它会自动初始化它吗?这解释了为什么新的RuntimeException似乎将自身设置为原因。但这并不能解释为什么我的代码(现在发布)永远不会进入无限循环。哦,你完全正确!我创建了一个将null作为原因传递的异常类,认为这与不传递原因具有相同的影响。