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?

Était-ce utile?

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 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

  

échappe Unicode sont développés avant l'analyse lexicale.   Le fait que l'évasion Unicode apparaît dans une chaîne littérale est hors de propos.   Voir JLS 3.2.

  • ressources

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top