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作为原因传递的异常类,认为这与不传递原因具有相同的影响。