10

なぜこれは Java 6 (Sun 1.6.0_16) でコンパイルされるのですか?

System.out.println("\u000B");

...しかし、これではありません:

System.out.println("\u000A");

このプログラムについて:

public class Test {
  public static void main(String argv[]) {
  System.out.println("\u000A");
  }
}

私は得る

Test.java:3: unclosed string literal
System.out.println("\u000A");

何が起きてる?

4

4 に答える 4

20

問題は、Unicode の置換がコンパイルの非常に早い段階で行われることです。Unicode エスケープは、(他のエスケープ シーケンスのように) 文字列や文字リテラルで有効なだけでなく、コード内のどこでも\t有効です。それらは、セクション 3.10.6ではなく、仕様の別の領域 (セクション 3.3 ) で説明されています。後者のみが、文字および文字列リテラルのエスケープ シーケンスに関するものです。

基本的に、字句構造の詳細については、仕様のセクション 3 をお読みください:)

したがって、あなたのコードは実際には次のものと同等でした:

public class Test {
  public static void main(String argv[]) {
  System.out.println("
");
  }
}

...明らかに有効なコードではありません。改行や改行は、基本的に「\r」や「\n」のエスケープシーケンスを使うのがベストです。

個人的には、この Unicode エスケープの処理は Java の欠陥であると考えていますが、現時点でできることはあまりありません :(

于 2010-10-25T08:32:39.437 に答える
3

Unicode エスケープは、字句解析の前に展開されます。Unicode エスケープが文字列リテラル内に現れるという事実は関係ありません。JLS 3.2 を参照してください。

于 2010-10-25T08:34:30.323 に答える
1

\u000a = \n とコンパイラが Java ソースを処理してトークンに変換するため、コードでその Unicode 文字を使用できないためです。\u000d=\r も同様

于 2010-10-25T09:08:36.573 に答える