Java >> Java tutorial >  >> Tag >> String

JDK 9/10/11:Bivirkninger fra +=på Java String

Spørgsmålet "Hvorfor giver `array[i++%n] +=i+" "` forskellige resultater i Java 8 og Java 10?" blev offentliggjort tidligere på ugen på StackOverflow.com. Det peger på en fejl i Java-compileren, der findes i JDK9 og nyere, men som ikke findes i JDK8.

Som forklaret i StackOverflow-tråden leverede Didier L et simpelt eksempel på Java-kode, der gengiver dette problem. Det er tilpasset i den næste kodeliste.

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();
   }
}

Når man læser koden vist ovenfor, ville man forvente at se strengen "Array Index Evaluated" vist én gang, hvis denne klasses main(String[]) funktion blev udført. Med JDK8 var det tilfældet, men siden JDK 9 har det ikke været tilfældet. Det næste skærmbillede viser dette. Eksemplerne vist på skærmbilledet viser, at når klassen er kompileret med javacs -source og -target flag sat til "8 ", vises strengen kun én gang, når den kompilerede klasse udføres. Men når javac 's -source og -target flag er sat til "9 ", vises strengen to gange, når den kompilerede klasse udføres.

Denne fejl findes i JDK9, JDK10 og JDK11. Olivier Grégoire har beskrevet denne fejl, "Problemet ser ud til at være begrænset til strengsammenkædning og tildelingsoperatoren (+= ) med et udtryk med bivirkning(er) som venstre operand.”

JDK-8204322 [“‘+=’ anvendt på strengoperander kan fremkalde bivirkninger”] er blevet skrevet til denne fejl, er blevet løst, og dens opløsning er i øjeblikket målrettet mod JDK11. Fejlrapporten beskriver problemet, "Når du bruger +=-operatoren, ser det ud til, at javac dublerer koden før +=." Det forklarer også, at kode skrevet som array[i++%n] += i + " "; kompileres effektivt til kode som array[i++%n] = array[i++%n] + i + " "; . Jan Lahodas kommentar til fejlen beskriver, hvorfor den opstår. Aleksey Shipilev har anmodet om, at denne rettelse tilbageporteres til JDK 10, og det ser ud til, at det vil ske via JDK-8204340.

Yderligere baggrundsinformation om denne fejl kan findes i den tidligere nævnte StackOverflow-tråd, i den relaterede StackOverflow-chat og på OpenJDK compiler-dev-mailinglistetrådene "Compiler-fejl om strengsammenkædning" og "RFR:8204322:'+=' anvendt to String operander kan fremkalde bivirkninger“.


Java tag