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 下的行为是一致的了。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 121,269评论 16 134
  • 原链接:http://www.cnblogs.com/langtianya/p/3757993.html JDK各...
    把爱放下会走更远阅读 688评论 0 10
  • 传送门 解读阿里Java开发手册(v1.1.1) - 异常日志 前言 阿里Java开发手册谈不上圣经,但确实是大量...
    kelgon阅读 3,559评论 4 50
  • 《亲爱的》我们之间发生了什么我一无所知你也一无所知吧只是影子交汇在地上我决定从此不再说话 《世无可恋》我的恋人在地...
    葺宝阅读 126评论 1 4
  • 我是一个过客,你也是一位过客, 有一个结点我们成为了互相的过客。 不要怕离别的愁绪, 这只是岁月留下的悲伤故事。 ...
    丁丁是一匹野马阅读 125评论 5 7