Problème analyse syntaxique évasion unicode dans Java 6 cordes littéral ...?
Question
Pourquoi cette compilation en Java 6 (Sun 1.6.0_16):
System.out.println("\u000B");
... mais pas ceci:
System.out.println("\u000A");
Sur ce programme:
public class Test {
public static void main(String argv[]) {
System.out.println("\u000A");
}
}
Je reçois
Test.java:3: unclosed string literal
System.out.println("\u000A");
Qu'est-ce qui se passe ici?
La solution
Le problème est que le remplacement Unicode se fait très tôt dans la compilation. échappe Unicode ne sont pas seulement valide dans les chaînes et littéraux de caractères (comme d'autres séquences d'échappement telles que \t
sont) - ils sont valables où dans le code. Ils sont décrits dans une autre zone de la spécification - section 3.3 plutôt que la section 3.10.6 ; seule cette dernière est sur les caractère et chaîne littérale séquences d'échappement.
Fondamentalement, lire la section 3 de la spécification pour plus de détails sur la structure lexicale:)
Donc, votre code a été en fait équivalent à:
public class Test {
public static void main(String argv[]) {
System.out.println("
");
}
}
... qui est évidemment pas un code valide. Pour le retour de chariot et saut de ligne, essentiellement, il est préférable d'utiliser l'évasion « \ r » et « \ n » séquences.
Personnellement, je considère cette manipulation d'échapper Unicode comme une faille dans Java, mais il n'y a pas beaucoup que nous pouvons faire à ce sujet maintenant: (
Autres conseils
c'est parce que \ u000a = \ n et le processus de compilation de la source java afin de le convertir en jetons, de sorte que vous ne pouvez pas utiliser ce caractère unicode dans votre code. La même chose pour \ u000d = \ r
Si je ne me trompe pas, pour éviter la prepocessing nous pourrions le résoudre en changeant la ligne:
System.out.println((char)10);
La limitation est que, en étant un CHAR
, il est l'extension sera de 0 à 255.