本周支持一个系统升级到 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 下的行为是一致的了。