StartDocumentEvent 在 JDK6 和 JDK8 下的差异

本周支持一个系统升级到 JDK8,发现了一个 JDK6 和 JDK8 的差异的新坑,具体在 com.sun.xml.internal.stream.events.StartDocumentEvent 这个类的构造方法上,在 1.6 中:

public StartDocumentEvent(String var1, String var2, boolean var3, Location var4) {
    this.init();
    this.fEncodingScheam = var1;
    this.fVersion = var2;
    this.fStandalone = var3;
    this.fEncodingSchemeSet = false;
    this.fStandaloneSet = false;
    if (var4 != null) {
        this.fLocation = var4;
    }

}

请注意最后的做了一个判断,传入的 localtion 的参数不为 null 的时候,再把传入的 location 设置到 fLocation 去,而由于 StartDocuemntEvent 继承了 DummyEvent,所以 fLocation 的默认值是 DummyLocation.INSTANCE(见 DummyEvent 的构造函数)。

但是到了 1.8 下面,1.6 的部分的构造函数中的代码移到了 init 方法中,其代码如下:

public StartDocumentEvent() {
    this.init("UTF-8", "1.0", true, (Location)null);
}

protected void init(String encoding, String version, boolean standalone, Location loc) {
    this.setEventType(7);
    this.fEncodingScheam = encoding;
    this.fVersion = version;
    this.fStandalone = standalone;
    if (encoding != null && !encoding.equals("")) {
        this.fEncodingSchemeSet = true;
    } else {
        this.fEncodingSchemeSet = false;
        this.fEncodingScheam = "UTF-8";
    }

    this.fLocation = loc;
}

从上面的代码中看到,在 JDK 1.8 中,并没有做 location 为 null 的判断,而是直接赋值给了 fLocation,导致同样的 new StartDocumentEvent 的这段代码,在 1.6 下,fLocation 不为 null,在 1.8 下,fLocation 为 null。

解决的办法只能是,将 new StartDocumentEvent() 的代码改成 new StartDocumentEvent("UTF-8", "1.0", true, DummyLocation.INSTANCE),来保证在 JDK6 和 JDK8 下的行为是一致的了。

你可能感兴趣的:(StartDocumentEvent 在 JDK6 和 JDK8 下的差异)