jdk 1.8 字符串+_JDK 9/10/11:Java字符串上+ =的副作用

jdk 1.8 字符串+

问题“ 为什么`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

jdk 1.8 字符串+

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

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

相关文章

IntelliJ IDEA for Mac 如何设置字体和字号

按组合键 Command , 打开偏好设置窗口,在左侧菜单导航栏找到 Editor --> Font,如下图所示:

vs mono linux,[.NET][C#.NET]走跳在Linux的人生(八).NET Core与Mono执行

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?我们来试试用.NET Core从Windows环境开发,然后porting到Linux环境(布署及执行.NET Core),之前曾看过stackoverflow文章提到Mono的性能问题&…

java char类型空值_展望Java的未来:空值类型

java char类型空值尽管有前途的Java值类型不是迫在眉睫,但我偶尔还是喜欢在OpenJDK valhalla-dev邮件列表中打听一下,以了解事情的进展情况并了解即将发生的事情。 诚然,由于我对所用术语的了解有限,并且其中某些消息的底层细节&a…

IntelliJ IDEA 如何设置编辑窗口的背景图片

按下组合键 Shift Command A,打开查找动作的窗口,在输入框中输入 set Background Image,然后选中它,如下图所示: 背景图片设置窗口如下所示:

2013下半年福建高等学校非计算机专业学生计算机二级c语言原题,2013年福建省计算机二级c语言真题及答案(填空题部分)...

1、程序Ccon441.c的功能是:从键盘输入一个直角三角形的两条直角边a和b,计算并输出其周长和面积。将程序填写完整。#include#includevoid main(){double a,b,c,circle,area;printf("Input 2 edges:");scanf(/**/ "%lf %lf" /**/,&…

spring boot示例_Spring Boot完成示例

spring boot示例这篇文章提供了一个使用Spring Boot开发松耦合的REST服务的完整示例。 使用spring boot,我们可以开发可独立运行的生产就绪的Java应用程序,使其成为独立的应用程序,它具有最小的依赖关系并且与其他应用程序的耦合较少。 大多数…

IntelliJ IDEA for Mac的窗口操作

最大化代码编辑窗口的快捷键:Fn Shift Command F12

c++语言编译环境,Windows安装C++开发环境-C++开发环境搭建-嗨客网

Windows安装C语言开发环境教程这里,我们选择使用 Dev-C。Dev-C下载地址https://sourceforge.net/projects/orwelldevcpp/Dev-C下载打开上面的链接,打开 Dev-C 的下载页面,如下图所示:这里我们点击 Download,跳转到下载…

软件实施与硬件实施的区别_实施白色标签

软件实施与硬件实施的区别有时(根据我的经验,很多时候)您需要为应用程序添加白色标签。 您通常可以以SaaS方式运行它,但是一些重要的或高知名度的客户端可能需要专用部署或本地部署,或者只是在云部署中“自己的一角”。…

Sublime Text 设置在标签页中打开文件

按组合键 Command , 打开配置文件,如下图所示,左边的是系统配置文件,里面都是默认的配置内容,你无法修改,但是你可以复制到右边的用户级别的配置文件中。 Sublime Text 默认打开一个文件时都会打开一个新的窗口&…

c语言计算机培训,C语言计算机基础学习||新手入门必看

本次内容笔者将完全抛弃传统教学的形式,通过自己所学所闻得出来的心得,用通俗易懂的语言结合生活,来让大家更好的认识计算机编程,更好的入门计算机基础。笔者也想用自己的论述告诉大家,专业知识有时会比较枯燥乏味点&a…

javafx如何带菜单_JavaFX技巧30:带有DropShadow的ScrollPane

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

IntelliJ IDEA 怎么知道项目信息_如何重新打开已经移除的项目_如何关闭和删除项目

文章目录 一个窗口只管理一个项目如何打开已经移除的项目Open 和 Import 的简单区别关闭项目如何删除项目IDEA 怎么知道项目信息这里要特别理解一个问题,硬盘上的项目文件必须在 IDEA 的配置文件中,IDEA 才能识别这个文件,而通过 IDEA 添加本地文件(例如添加项目或者添加模…

hmi开发软件c语言,组态,HMI,软件,VC++,源代码

要点:1)、创建新的HMIBuilder应用。2)、如何创建刻度。3)、如何创建一个组合图形。参阅TestMeter1要点:1)、创建新的HMIBuilder应用。2)、如何快速通过组合操作创建按钮。参阅TestButton1.要点:1)、创建新的HMIBuilder应用。2)、如何快速创建…

机器学习java_Java机器学习,第2部分

机器学习java欢迎使用本教程的第二部分,该教程使用LightningScorer为PMML文件评分。 让我们找出其他参数是如何工作的。 初始步骤与教程的第一部分相似。 首先获取本地副本 git clone https://github.com/sezinkarli/lightningscorer.git并用Maven构建它 mvn c…

IntelliJ IDEA 如何知道项目中的模块数据_如何从项目源中选择模块加入当前项目中(添加模块)_如何移除项目中的模块(移除模块/删除模块)

文章目录IDEA 如何获取项目的模块数据从项目源中选择模块加入当前项目中如何移除项目中的模块方式一,选择模块的根目录(Content Root),鼠标右键 Remove方式二,打开【项目结构】窗口,在模块列表中选中模块&a…

c语言明解课后答案,明解C语言 中级篇 第一章答案

练习1-1#include #includeint main() {srand(time(0));int anw rand() % 7;printf("您的签运是:");switch (anw) {case 0:printf("大吉"); break;case 1:printf("吉"); break;case 2:printf("小吉"); break;case 3:printf("吉&q…

java 迁移数据_Java 10迁移建议

java 迁移数据你好,再一次到另一个热点。 我的名字是Java Champions的平台工程师和DevOps专家Peter Pilgrim。 如您所知,Java 9引入了模块系统。 您可能正在将服务迁移到JDK 10或更高版本,或者至少在考虑中。 我对企业的一般建议是&#xff…

IntelliJ IDEA for Mac 如何配置项目模块的源代码根目录_源码文件的根目录

按下组合键 Command ; 打开【项目结构】配置窗口;然后选择左侧菜单栏的【Modules】;然后在右侧的模块列表中,选择你要配置的模块;接着选择右侧界面中的【Sources】标签。 首先添加内容根目录(Content Root&#xff0…

c语言动态内存分配数组,【C】动态内存分配

## 动态内存分配的意义C语言中的一切操作都是基于内存的变量和数组都是内存的别名内存分配由编译器在编译期间决定定义数组的时候必须指定数组长度数组长度是在编译期就必须确定的需求:程序在运行过程中,可能需要使用一些额外的内存空间malloc和freemall…