JDK 9/10/11:Java字符串上+ =带来的副作用

问题“ 为什么`array [i ++%n] + = i +”在Java 8和Java 10中给出不同的结果? ”已于本周初发布在StackOverflow.com上 。 它指向JDK9和更高版本中存在的Java编译器中的错误 ,但JDK8中不存在。

如StackOverflow线程上所述, Didier L提供了一个简单的Java代码示例来重现此问题。 这将在下面显示的代码清单中进行调整。

package dustin.examples.strings;import static java.lang.System.out;/*** Example demonstrating JDK-8204322 and adapted from Didier L's* original example (https://stackoverflow.com/q/50683786).*/
public class StringConcatenationBug
{static void didierLDemonstration(){final String[] array = {""};array[generateArrayIndex()] += "a";}static int generateArrayIndex(){out.println("Array Index Evaluated");return 0;}public static void main(final String[] arguments){didierLDemonstration();}
}

阅读上面显示的代码,如果执行了此类的main(String[])函数,则可以看到一次显示了字符串“ Array Index Evaluated”。 对于JDK8,情况就是这样,但是自JDK 9起,情况并非如此。 下一个屏幕快照对此进行了演示。 屏幕快照中显示的示例显示,当使用javac的-source-target标志设置为“ 8 ”编译该类时,在执行该编译的类时,该字符串仅显示一次。 但是,当javac-source-target标志设置为“ 9 ”时,在执行编译的类时,该字符串显示两次。

JDK9错误

此错误存在于JDK9,JDK10和JDK11中。 OlivierGrégoire描述了此错误,“问题似乎仅限于字符串连接和赋值运算符( += ),且表达式的副作用为左操作数。”

JDK-8204322 [针对字符串操作数应用“ + =”可能会引起副作用”已针对此错误编写,已解决,其解决方案当前针对JDK11 。 错误报告描述了问题,“当使用+ =运算符时,javac似乎在+ =之前复制了代码。” 它还说明了类似array[i++%n] += i + " ";编写的代码array[i++%n] += i + " "; 有效地编译为类似于array[i++%n] = array[i++%n] + i + " "; 。 扬·拉霍达(Jan Lahoda) 对错误的评论描述了它发生的原因。 Aleksey Shipilev已要求将此修复程序反向移植到JDK 10,看来它将通过JDK-8204340进行 。

有关此错误的其他背景信息,可以在前面提到的StackOverflow线程 , 相关的StackOverflow聊天以及OpenJDK 编译器-dev邮件列表线程中找到“ 有关字符串连接的编译器错误 ”和“已应用RFR:8204322:'+ ='字符串操作数会引起 “ 副作用 ”。

翻译自: https://www.javacodegeeks.com/2018/06/jdk9-side-effects-java-string.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【自适应盲均衡7】分数间隔的复数常模算法(FSE-CMA)

关注公号【逆向通信猿】更精彩!!! 理论推导 基于分数间隔的复数常模算法(FSE-CMA)的推导其实与符号间隔的算法是类似的,见 【自适应盲均衡2】多径衰落信道的复数常模算法(CMA)的理论推导与MATLAB仿真 分数间隔均衡器模型 分数间隔均衡器通常有两种比较经典的模型,…

JavaFX技巧30:带有DropShadow的ScrollPane

最近,在我的一个项目中,我发现用户很难看到ScrollPane实例的内容当前是否已滚动。 一种更清晰的方法是在滚动窗格的顶部添加阴影。 这也是Google的Material Design建议的。 所以我尝试了一下。 在我的解决方案中,我只是向ScrollPane添加了一…

【有限域除法】二元多项式除法电路原理及MATLAB详解

关注公号【逆向通信猿】试读更多内容!!! 二元多项式除法电路原理 例: g ( x ) = x 4 + x 2 + x + 1 g(x)=x^4 + x^2+x+1

Spring Apache Kafka教程

在本SpringApache Kafka课程中,我们将学习如何在Spring Boot项目中开始使用Apache Kafka,并开始生成和使用我们所选主题的消息。 除了一个简单的项目外,我们还将深入探讨Kafka的术语以及分区概念在Kafka中的工作方式。 让我们开始吧。 1.简介…

adf4351使用方法_ADF:使用HTTP POST方法进行URL任务流调用

adf4351使用方法众所周知,可以通过某些URL直接从浏览器或某些外部应用程序调用有限任务流。 如果任务流的属性“ URL invoke”设置为“ URL-invoke-allowed”,则启用此功能,该功能通常在集成项目中使用。 通常,客户端(…

【定时同步系列2】16QAM调制+OM定时+信号分段处理+误码率曲线之MATLAB仿真(复信号模型)

关注公号【逆向通信猿】阅读更多内容!!! 算法回顾 关于O&M算法的原理、公式推导与详解,请参考博客: 【定时同步系列1】定时同步之MARTIN OERDER算法原理与公式推导 鉴于前期有很多读者私信博主O&M算法的MATLAB仿真过程,前期太忙没来得及做。终于抽得一日闲,可…

【定时同步系列3】8PSK调制+OM定时+信号分段处理+误码率曲线之MATLAB仿真(实信号模型)

关注公号【逆向通信猿】更精彩!!! 仿真结果 对于8PSK调制,仿真结果如下: 误码率曲线图 假设 E b / n 0 = 14 d B Eb/n_0 = 14dB

借助Web技术,桌面用户界面将保持活跃

要了解Java桌面应用程序有什么问题,让我们看一下JavaFX(桌面应用程序的领先UI框架)的新功能。 很明显,它正在向Web方法发展,从Web世界中借用了越来越多的功能。 JavaFX支持一部分CSS功能,并附带其自己的属性…

Win10窗口侧边栏设置Win7模式

本人非常不喜欢Win10的几个系统功能 贴靠窗口时自动调整窗口大小,填满可用空间关将窗口对齐时,显示能够在其旁边对齐的内容当我调整某个贴靠窗口的大小时,也调整任何相邻贴靠窗口的大小 想调整成Win7那种模式和风格的话,设置如下…

VS2017无法打开文件MSVCRTD.lib

需要添加组件,如下图

【定时同步系列4】QPSK调制+OM定时(FFT实现及频域补偿)+信号分段处理+误码率曲线之MATLAB仿真(复信号模型)

关注公号【逆向通信猿】更精彩!!! 仿真结果 对于QPSK调制,仿真结果如下: **分析:**可以看出,补偿前的定时相位约为-0.1,补偿后的相位在0附近波动,但由于没有进行环路滤波(可采用卡尔曼滤波器),所以波动很大,这也导致了后续解调结果不理想,实际中必须加入滤波器…

【锁相环系列2】数字判决反馈环之BPSK信号解调MATLAB仿真(含环路滤波器参数设置)

关注公号【逆向通信猿】更精彩!!! 仿真结果 频偏补偿之前的星座图,是一个“环”。 频偏补偿后的BPSK信号星座图 解调误码率曲线 <

hadoop emr_在Amazon EMR上运行Hadoop MapReduce作业

hadoop emr不久前&#xff0c;我发布了如何使用CLI设置EMR群集的信息。 在本文中&#xff0c;我将展示如何使用适用于AWS的Java SDK来设置集群。 展示如何使用Java AWS开发工具包执行此操作的最佳方法是展示我认为完整的示例&#xff0c;因此让我们开始吧。 设置一个新的Maven…

【MFC系列2】Win32项目转换为MFC项目

关注公号【逆向通信猿】更精彩&#xff01;&#xff01;&#xff01; 一、MFC的组成 a)必须有一个CWinApp的派生类&#xff1b; b)必须用派生类在全局定义一个对象theApp; c)在派生类中必须重写InitInstance虚函数&#xff1b; d)MFC程序就用CWinApp派生类中的InitInstance虚…

servlet面试常问问题_50个Servlet面试问答

servlet面试常问问题Servlet是Java EE的一个非常重要的主题&#xff0c;所有Web应用程序框架&#xff08;例如Spring和Struts&#xff09;都建立在它之上。 这使servlet成为Java访谈中的热门话题。 在这里&#xff0c;我提供了50个servlet面试问题的列表&#xff0c;并提供了答…

Win10图片查看器打不开图片,报错内存不足

关注公号【逆向通信猿】更精彩&#xff01;&#xff01;&#xff01; 按如下设置即可

学习Java的最佳方法

Java是某些人可能会说很难学习的语言之一&#xff0c;而其他人则认为它与其他语言具有相同的学习曲线。 两种观察都是正确的。 但是&#xff0c;由于Java具有平台无关性&#xff0c;因此在语言方面具有相当大的优势。 Java是一种低级语言&#xff0c;它以一种简单的方式来实现…

CSAPP:Attack lab

关注公号【逆向通信猿】更精彩&#xff01;&#xff01;&#xff01; 原文地址&#xff1a;https://www.jianshu.com/p/db731ca57342 本文介绍的是CSAPP书籍中的第三个lab: Attack lab。通过这个lab我们能够更加清楚和深入的了解到缓冲区溢出的隐患&#xff0c;以及如何利用缓…

Spring休眠教程

1.简介 在本文中&#xff0c;我们将演示如何利用最流行的ORM&#xff08;对象关系映射&#xff09;工具之一的Hibernate的功能 &#xff0c;该工具可将面向对象的域模型转换为传统的关系数据库。 Hibernate是目前最流行的Java框架之一。 由于这个原因&#xff0c;我们在Java Co…

无状态会话的ejb_Java EE状态会话Bean(EJB)示例

无状态会话的ejb在本文中&#xff0c;我们将了解如何在简单的Web应用程序中使用状态会话Bean来跟踪客户端会话中的状态。 1.简介 有状态会话Bean通常保存有关特定客户端会话的信息&#xff0c;并在整个会话中保留该信息&#xff08;与无状态会话Bean相对&#xff09;。 有状态…