Статьи

JDK 9/10/11: побочные эффекты от + = на Java String

Вопрос « почему` 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

Эта ошибка существует в 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, являются их собственными.