以下所示代碼:html
class GrammarTest{ public static void main(String[] args){ char ch=0x30; System.out.println(ch); //正常,輸出0 ch='\u0030'; System.out.println(ch); //正常,輸出0 System.out.println("a\u0022.length() + \u0022b".length()); //輸出2 } }
結果說明,編譯結果錯誤提示以下:java
上述程序有編譯錯誤。若是刪除多行註釋,則編譯錯誤消除.git
【結果分析】:github
首先分析編譯錯誤的緣由,能夠確定編譯錯誤是由多行註釋引發的,它包含了一個\u開頭的Unicode轉義字符序列,可是卻沒有緊跟着4個16進制的數(0~65535),致使該轉義失效。java是容許在註釋以及代碼中使用\u開頭的Unicode轉義字符的,可是要求轉義必須有效,不然編譯器會報告錯誤。web
刪除該段註釋或者使該轉義有效以後,執行上述代碼獲得的結果是2,又是爲何呢?原來,Java 對在字符串字面常量中的 Unicode 轉義字符沒有提供任何特殊處理。編譯器在將程序解析成各類符號以前,先將Unicode轉義字符轉換成爲它們所表示的字符。因此,程序中的第一個 Unicode轉義字符將做爲一個單字符字符串字面常量( "a")的結束引號,而第二個Unicode 轉義字符將做爲另外一個單字符字符串字面常量( "b")的開始引號,該程序實際運行的代碼以下:code
System.out.println("a".length() + "b".length());htm
這樣來看,輸出結果爲2也就不足爲奇了。注意對於字符串類型字符串
源代碼地址:https://github.com/rocwinger/java-disabuseget