Java 6 文字列リテラルの Unicode エスケープの解析で問題が発生しました…?
質問
これが 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になることである。
所属していません StackOverflow