首先,我们说这是一个没有判断力的区域。 正如CodeFX的作者和热情的软件开发人员Nicolai Parlog在http://java9.wtf/页面的描述中说的那样,其目的不是玩怪罪游戏,而是展示Java 9上可能发生的事情。

未来的麻烦:Java 9打h

新的编译错误

Nicolai指出对javac的更改可能会导致新的编译错误 。 他解释说,编译错误的根源可能是Java 9编译器的类型推断在某些情况下工作不同的事实。 他写道:“该项目中的所有文件都可以使用Java 8很好地编译,但是不能使用Java 9进行编译。” Nicolai敦促读者寻找注释// fail看到什么不起作用,并// pass使其能够在Java 9中工作的修复程序。

一些错误可能来自(int) Comparable<T>类的强制转换 :

public void spinnerModel(SpinnerNumberModel spinnerModel) {// this could have happened somewhere else:// spinnerModel.setMinimum(0);// spinnerModel.setMaximum(360);// spinnerModel.setValue(45);int newValue = (int) spinnerModel.getValue() + 1;newValue = Math.min(newValue, (int) spinnerModel.getMaximum()); // failnewValue = Math.max(newValue, (int) (Object) spinnerModel.getMinimum()); // passspinnerModel.setValue(newValue);
}

一些具有通用数组的恶作剧会停止工作:

public static <I> Optional[] lift(I[] array) { ... }
public static <T> T[] flatten(Optional<T>[] array) { ... }private Stream<T[]> streamSelectionPaths() {Object[][] things2d = new Object[0][0];return Arrays.stream(things2d)
//          .map(thing -> (Optional<T>[]) lift(thing)) // pass.map(GenericArray::lift) // fail.map(GenericArray::flatten);
}
(最后检查:8u131和9-ea + 172-jigsaw)

下一站:Maven JAXB2插件

Nicolai写道, Maven JAXB2插件无法在Java 9上处理架构绑定 ,并解释说,可以通过运行插件并随后测试期望的类的存在来证明该问题。 但是,这并不是最烦人的部分:如果没有插件,就无法重新创建错误。

wtf.java9.maven_jaxb2_plugin中的代码是该插件正在运行的代码的简化版本(无意中“正确化”了吗?),但正如另一项测试所示,它可在Java 8和Java 9上运行。

使用mvn clean test运行项目会创建两个generated-jaxb-*文件夹,一个用于插件创建的源,另一个用于JAXB API。 尽管它们在Java 8上是相同的,但对于Java 9却不能说相同。正如Nicolai解释的那样, 测试试图验证源是否存在并因此在Java 9上失败。

(最后检查:8u131和9-ea + 172-jigsaw)

该项目的发布版本使用JAXB2插件的版本0.13.2。 使它与Java 9特定版本一起使用的努力也未成功。 这些努力可以在Maven JAXB2插件的这个私有分支中进行跟踪。

为了缓慢地处理插件的实现,实现了不同的变体,尤其是关于使用的EntityResolver 。 您可以在EntityResovlerFactory看到它们,然后选择它们作为Maven属性entity.resolver. 例如:

mvn clean test -Dentity.resolver=simple

默认情况下,插件的方法会尽可能接近地复制。

还请参见: 阐明了Java 9功能:JDK 9 Early Access文档已发布

第三招:Noto Sans字体

您应该知道,在Java 9上使用Noto Sans字体与在Java 8上使用Noto Sans字体是不同的-在速度方面(至少在Linux上)。 根据Nicolai的说法,问题似乎出在T2KFontScaler的创建上,它深深地出现在计算组件首选大小的过程中:

Font2D font = FontUtilities.getFont2D(new Font("Noto Sans CJK JP Black", 0, 12));
Constructor<?> constructor = Class.forName("sun.font.T2KFontScaler").getConstructor(Font2D.class, int.class, boolean.class, int.class);
constructor.setAccessible(true);
// for this to not end in a heap dump you need to have Noto Sans CJK JP Black
// installed on your machine
Object scaler = constructor.newInstance(font, 0, true, 18604592);

更糟糕的是:如果这种情况发生在紧密的循环中(例如,显示标签列表的大小,每个标签使用不同的字体),剩下要做的就是排除这些字体。

如果测试运行时间超过半秒,则该测试试图通过使测试失败来证明性能差异。 但是,由机器来“决定”这是否足以在Java 8上成功而在Java 9上失败。

(最后检查:8u131和9-ea + 172-jigsaw)

XML转换器疯狂

javax.xml.transform.Transformer的行为已发生很大变化。

让我们举个例子:

// prepare an XML file as a DOM Source
String xml = "...";
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(xml)));
// maybe add some nodes or CDATA content// transform the XML
Source source = new DOMSource(document);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
// maybe configure transformer
StringWriter outputWriter = new StringWriter();
transformer.transform(source, new StreamResult(outputWriter));
String transformedXml = outputWriter.toString();// now compare `xml` and `transformedXml`

在Java 8和9之间(带有和不带有配置以及带有和不带有xml:space="preserve"不同。 这是最常见的行为:

  • 现有的压痕仍然存在
  • 包括CDATA在内的新节点是内联的

如果未将转换器配置为超出默认值并且与xml:space="preserve"无关,则可以注意到这一点。 但是,当使用OutputKeys.INDENT=yesindent-amount=4配置转换器时,Java 8和9的行为会有所不同。 在Java 8上,您将获得以下内容:

  • 现有的压痕仍然存在
  • 根据设置缩进新节点
  • CDATA不缩进

就Java 9而言,将发生以下情况:

  • 整个文档根据设置缩进,包括一堆乱码
  • 因此,新节点缩进
  • CDATA也加入了新的行,并且缩进了,从根本上改变了XML!

Nicolai补充说,通过进一步配置,很明显xml:space="preserve"行为也有所不同。 尽管它对Java 8毫无影响,但在Java 9上也没有作用(这使我们回到了首先描述的“无变化”的情况)。

该测试使用JUnit 5的嵌套测试来证明该行为。

(最后检查:8u131和9-ea + 172-jigsaw)

有助于

非常欢迎您提供文稿,如果您有任何问题,请打开一个问题 。 但是,如果您想做出贡献,请确保您的演示中尽可能多地选中以下框:

  • 它应该尽可能小
  • 它应该是Maven模块,其中mvn clean test在Java 8上通过但在Java 9上失败
  • 它无需进行大量编辑即可演示行为:
    • 如果编译器或Surefire在不同版本上需要不同的参数,请使用配置文件
    • 如果整个Maven运行都需要参数,请查看.mvn/jvm.config工作方式
  • 它的自述文件应该描述问题,可能显示一些代码(并链接到更多代码),并指出解决方案(如果有); 另外,别忘了从上方链接到它
  • 自述文件还应提及观察到所描述行为的Java 8和9版本

检出页面和/或Github存储库 。

翻译自: https://jaxenter.com/java-9-fails-code-breaks-135036.html

Java 9失败以及如何修复它们相关推荐

  1. java 死锁的检测与修复_调查死锁–第4部分:修复代码

    java 死锁的检测与修复 在这个简短的博客系列的最后BadTransferOperation中,我一直在讨论分析死锁,我将修复BadTransferOperation代码. 如果您已经看过本系列的其 ...

  2. saltstack部署java应用失败无日志——CICD 部署

    大家好,我是烤鸭: ​   最近在搞公司的CICD,遇到各种问题.复盘总结一下. CICD 架构 这篇文章写得很详细,可以看一下 https://linux.cn/article-9926-1.htm ...

  3. 重置计算机后无法开机,win10重置此电脑失败怎么办_win10重置此电脑失败无法开机修复方法...

    当win10系统使用时间长了,难免会有一些电脑故障的出现,这时有些用户就会选择使用重置电脑的方式来解决,但是最近有用户再给自己的win10系统进行重置时总是出现失败的情况,那么win10重置此电脑失败 ...

  4. java项目失败直接报Disconnected from server

    这bug出的简直就是无法形容,耗时3天才解决,文末记得点赞,收藏,或许你现在还没有遇到,但是 收藏起来也不错. 异常一:IDEA tomcat 启动java项目失败直接报Disconnected fr ...

  5. java return 1 wex5_求大神解决****ERROR****: 子任务 java 执行失败。

    开始...... 保存配置信息: init 编译UI资源: 开始...... [JUSTEP_HOME in UIServer]: E:\WeX5_V3.6\WeX5_V3.6 2017-04-12 ...

  6. java mkdirs 看不到,java mkdirs 失败

    ...创建目录失败解决_DQchat的博客-CSDN博客_java mkdirs... 2018年10月25日 下面是创建文件夹的代码,可以说很简单的 File file =newFile(" ...

  7. 初始化java工具失败,spring初始化失败解决办法

    spring初始化失败 报错: 00:34:33,066  INFO [main] ClassPathXmlApplicationContext:513 - Refreshing org.spring ...

  8. java转行失败_转行学JAVA,成功和失败的原因

    Java是所有编程中使用范围最广的一种语言,在各种编程语言中排名位居榜首,也是一种开源语言,市面上很多大型网站.APP都是用Java来完成的.有些人转行Java成功有些人失败,西安汇杰.用友产业学院帮 ...

  9. Ubuntu软件包升级失败的终极修复方法

    升级失败 apt upgrade -y 尝试修复 apt autoremove Reading package lists... Done Building dependency tree Readi ...

最新文章

  1. 【 C 】深入了解递归
  2. 成功解决Python中导出图片出现错误SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position
  3. 百分点集团被APAC CIO Outlook杂志评选为亚太区大数据企业25强
  4. hibernate_和ORM的关系
  5. [Lintcode]136. Palindrome Partitioning /[Leetcode]131. Palindrome Partitioning
  6. 旅游系统_数字洛江智慧旅游系统助力提升旅游安全水平
  7. 【渝粤教育】广东开放大学 文化项目管理 形成性考核 (36)
  8. git 命令 clone分支的代码
  9. 为List配置一个搜索按钮
  10. dbutils mysql_使用DBUtils控制mysql事务
  11. Codeforces Round #382 (Div. 2) D. Taxes 歌德巴赫猜想
  12. Linux下自动备份Oracle数据库并删除指定天数前的备份
  13. 温度传感器利用寄存器计算出温度值
  14. Hibernate (load PK get and list PK iterator )
  15. python生成指定年份所有的天,并计算每天属于一年的第几周和周几
  16. 如何使用SqlLoader导入数据
  17. Windows server 2012 R2网卡驱动安装经历
  18. Ubuntu18.04 下载与安装(阿里云官方镜像站)
  19. SATA硬盘在安装OS时注意AHCI模式
  20. iOS 福利局之开发加速库分享

热门文章

  1. c语言程序填空题库大一,c语言程序填空题
  2. 【引用】 《道德经》全文、译文——上篇
  3. 成人学插画如何选培训班
  4. java计算机毕业设计微小型企业oa系统源码+数据库+lw文档+系统+部署
  5. java 缓存命中率_Redis缓存命中率
  6. matlab电压源容量,Matlab-SimPowerSystems-Electrical Sources模块使用说明
  7. 读书与思考(张五常)
  8. 瓦尔机器人智能行李箱_中国制造COWAROBOT智能“跟主人”行李箱正式亮相韩国
  9. 【愚公系列】2022年09月 微信小程序-webview内嵌网页的授权认证
  10. 应用层、表示层、会话层相关知识