2012-10-29 13 views
5

在JavaSpecialists通訊最新版中,作者提到了一段代碼是未編譯Java中爲什麼一些字符文字會導致Java中的語法錯誤?

public class A1 { 
    Character aChar = '\u000d'; 
} 

嘗試編譯它,你會得到一個錯誤,如:

A1.java:2: illegal line end in character literal 
       Character aChar = '\u000d'; 
           ^

爲什麼一個等效的c#代碼塊不顯示這樣的問題?

public class CharacterFixture 
{ 
    char aChar = '\u000d'; 
} 

我失去了什麼?

編輯:我原來的問題的意圖是C#編譯器是如何得到的Unicode文件解析正確的(如果有的話),爲什麼java的還是應該堅持使用不正確的(如果有的話)的解析? 編輯:我也希望myoriginal問題標題被恢復?爲什麼如此繁重的編輯,我強烈懷疑它大大改變了我的意圖。

+0

哈哈。你除了Java要改變?我需要這樣的笑聲:) – 2012-10-29 06:23:45

+2

你可以恢復你的原始標題(點擊「編輯X時間前」鏈接查看修訂版)。然而,原來的標題是比較Java的「方式」和C#的「方式」的主觀和議論。它們是不同規格的不同語言。 – 2012-10-29 06:25:52

+0

@pst - 但有了這個標題,我不應該問這個問題,因爲同樣的通訊給出了足夠的解釋。我尊重編輯,不會強迫它恢復。我的意圖是爲什麼兩個類似編譯器在這方面的差異。 – suhair

回答

12

Java的編譯器編譯\uxxxx轉義序列的第一個步驟之一,標記者得到的代碼裂紋甚至之前。當它實際開始標記化時,不再有\uxxxx序列;他們已經變成了他們所代表的字符,所以編譯器的Java例子看起來一樣,如果你確實類型在那裏莫名其妙回車。它這樣做是爲了提供一種在源文件中使用Unicode的方式,而不管源文件的編碼如何。即使ASCII文本仍然可以在必要的情況下完全代表Unicode字符(以可讀性爲代價),並且由於它的完成時間很早,您可以將它們放在代碼中的任何位置。 (你可以這樣說\u0063\u006c\u0061\u0073\u0073\u0020\u0053\u0074\u0075\u0066\u0066\u0020\u007b\u007d,編譯器會將它讀爲class Stuff {},如果你想自己討厭或折磨自己。)

C#不這樣做。 \uxxxx稍後會與程序的其餘部分一起翻譯,並且僅在特定類型的標記(即標識符和字符串/字符文字)中有效。這意味着它不能用於可以在Java中使用的某些地方。例如,cl\u0061ss不是關鍵字。

+0

您能否詳細說明「以後」,「某些類型的代幣」,「某些地方」? – Vic

+1

@Vic:「後來」講述的是明確的,因爲我可以把它和「某些地方」,甚至用一個例子來了。我已經爲「某些類型的代幣」添加了說明。 – cHao

相關問題