[英]Problem parsing unicode escape in a Java 6 String literal…?
為什么要在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替換是在編譯的早期完成的。 Unicode轉義不僅在字符串和字符文字中有效(如其他轉義序列,如\\t
) - 它們在代碼中的任何位置都有效。 它們在規范3.3的不同區域而不是3.10.6節中描述 ; 只有后者是關於字符和字符串文字的轉義序列。
基本上,閱讀規范的第3部分有關詞法結構的更多細節:)
所以你的代碼實際上相當於:
public class Test {
public static void main(String argv[]) {
System.out.println("
");
}
}
......這顯然不是有效的代碼。 對於回車和換行,基本上最好使用“\\ r”和“\\ n”轉義序列。
我個人認為這種處理Unicode轉義是Java中的一個缺陷,但現在我們無法做很多事情:(
在詞法分析之前擴展Unicode轉義。 Unicode轉義出現在字符串文字中的事實是無關緊要的。 見JLS 3.2。
這是因為\\ u000a = \\ n並且編譯器處理java源代碼以將其轉換為標記,因此您不能在代碼中使用該unicode字符。 \\ u000d = \\ r \\ n也一樣
如果我沒有弄錯,為了避免預處理我們可以通過更改以下行來解決它:
System.out.println((char)10);
限制是通過成為CHAR
,它的擴展名將從0到255。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.