Java 6 文字列リテラルの Unicode エスケープの解析で問題が発生しました…?

StackOverflow https://stackoverflow.com/questions/4012918

  •  26-09-2019
  •  | 
  •  

質問

これが 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");

何が起きてる?

役に立ちましたか?

解決

問題は、Unicodeの交換が非常に早いコンパイルで行われていることです。 (例えば\tなど、他のエスケープシーケンスがそうであるように)のUnicodeエスケープは、文字列と文字リテラルにだけ有効ではありません - の任意の場所にの彼らだ有効なコードで。 節 - 彼らは、仕様の異なる領域に記述していますむしろ部より3.3 の3.10.6こちら;唯一の後者は、の文字と文字列リテラルのエスケープシーケンスについてです。

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

あなたのコードだったので、の実際のと同等ます:

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

...これは明らかに有効なコードではありません。キャリッジリターンとラインフィードの場合、基本的には「\ R」を使用するのが最善だと「\ n」はエスケープシーケンスます。

個人的に私は、Javaの欠陥としてエスケープユニコードのこの取扱いを見るが、私たちは今、それについて行うことができますがたくさんありません:(

他のヒント

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

あなたのコードでそのUnicode文字を使用することはできませんので、トークンに変換するために、\ u000a = \ nと、コンパイラのプロセスJavaソースので、

それです。 \ u000d = \ R

のために同じ

私は間違っていないよ場合は、私たちがラインを変更することにより、それを解決することができprepocessing避けるために:

System.out.println((char)10);

の制限はCHARあることによって、それの拡張は、0から255になることである。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top