Problem Parsen Unicode-Escape in einer Java 6 Stringliteral ...?
Frage
Warum diese Kompilierung in Java 6 (Sun 1.6.0_16):
System.out.println("\u000B");
... aber nicht so aus:
System.out.println("\u000A");
An diesem Programm:
public class Test {
public static void main(String argv[]) {
System.out.println("\u000A");
}
}
Ich erhalte eine
Test.java:3: unclosed string literal
System.out.println("\u000A");
Was ist denn hier los?
Lösung
Das Problem ist, dass der Unicode-Ersatz sehr früh in der Zusammenstellung erfolgt. Unicode Fluchten sind nicht nur gültig in Strings und Zeichenliterale (wie andere Escape-Sequenzen wie \t
) sind - sie sind gültig überall in Code. Sie sind in einem anderen Bereich der Spezifikation beschrieben - Abschnitt 3.3 anstatt Abschnitt 3.10.6 ; nur das letztere ist über Charakter und Stringliteral Escape-Sequenzen.
Grundsätzlich Leseabschnitt 3 der Spezifikation für weitere Details über lexikalische Struktur:)
So Ihr Code war wirklich entspricht:
public class Test {
public static void main(String argv[]) {
System.out.println("
");
}
}
... das ist eindeutig nicht gültige Code. Für Wagenrücklauf und Zeilenvorschub, im Grunde ist es am besten, die „\ r“ zu verwenden und „\ n“ Escape-Sequenzen.
Persönlich sehe ich diesen Umgang mit Unicode als ein Fehler in Java zu entkommen, aber es gibt nicht viel, was wir jetzt dagegen tun können: (
Andere Tipps
es ist, weil \ u000a = \ n und der Compiler Prozess der Java-Quelle, um es in Token zu konvertieren, so dass Sie nicht, dass die Unicode-Zeichen in Ihrem Code verwenden können. Das gleiche gilt für \ u000d = \ r
Wenn ich mich nicht täusche, zu vermeiden, die prepocessing wir es durch eine Änderung der Linie in lösen könnte:
System.out.println((char)10);
Die Einschränkung ist, dass durch ein CHAR
zu sein, ist es Verlängerung von 0 bis 255 sein wird.