Вопрос « почему` array [i ++% n] + = i + «» «дает разные результаты в Java 8 и Java 10? »Был размещен ранее на этой неделе на StackOverflow.com . Это указывает на ошибку в компиляторе Java, которая присутствует в JDK9 и более поздних версиях , но отсутствует в JDK8 .
Как объяснялось в потоке StackOverflow , Didier L предоставил простой пример кода Java, который воспроизводит эту проблему. Это адаптировано в листинге кода, показанном ниже.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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(); }} |
Читая код, показанный выше, можно ожидать, что строка «Array Index Evaluated» будет отображаться один раз, если будет выполнена функция main(String[]) этого класса. С JDK8 это было так, но с JDK 9 этого не произошло. Следующий снимок экрана демонстрирует это. Примеры, показанные на снимке экрана, показывают, что когда класс компилируется с флагами javac ‘s -source и -target установленными в « 8 », строка отображается только один раз при выполнении скомпилированного класса. Однако, когда для javac — -source и -target flags установлено значение « 9 », строка отображается дважды при выполнении скомпилированного класса.
Эта ошибка существует в JDK9, JDK10 и JDK11. Оливье Грегуар описал эту ошибку: «Кажется, проблема сводится к оператору конкатенации и присваивания строк ( += ) с выражением с побочным эффектом (ами) в качестве левого операнда».
JDK-8204322 [«+ =», примененное к операндам String, может вызвать побочные эффекты »] было написано для этой ошибки, исправлено, и его разрешение в настоящее время предназначено для JDK11 . В отчете об ошибке описывается проблема: «При использовании оператора + = кажется, что javac дублирует код перед + =». Это также объясняет, что код написан как array[i++%n] += i + " "; эффективно скомпилирован в код как array[i++%n] = array[i++%n] + i + " "; , Комментарий Яна Лаходы об ошибке описывает, почему это происходит. Алексей Шипилев запросил, чтобы это исправление было перенесено в JDK 10, и похоже, что оно будет через JDK-8204340 .
Дополнительную справочную информацию об этой ошибке можно найти в ранее упомянутом потоке StackOverflow , в связанном чате StackOverflow и в темах списка рассылки OpenJDK compiler-dev « Ошибка компилятора о конкатенации строк » и « RFR: 8204322: ‘+ =’ apply» Строковые операнды могут спровоцировать побочные эффекты ».
| Опубликовано на Java Code Geeks с разрешения Дастина Маркса, партнера нашей программы JCG . См. Оригинальную статью здесь: JDK 9/10/11: Побочные эффекты от + = на Java String
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |
