標籤:代碼 test unicode 理由 產生 逸出字元 unit 問題 十六
下面的程式是對一個老生常談的例子做出了稍許的變化之後的版本。那麼,它會列印出什麼呢?
/** * Generated by the IBM IDL-to-Java compiler, version 1.0 * from F:\TestRoot\apps\a1\units\include\PolicyHome.idl * Wednesday, June 17, 1998 6:44:40 o’clock AM GMT+00:00 */public class Test{ public static void main(String[] args){ System.out.print("Hell"); System.out.println("o world"); }}
這個謎題看起來相當簡單。該程式包含了兩條語句,第一條列印Hell,而第二條在同一行列印。 world,從而將兩個字串有效地串連在了一起。因此,你可能期望該程式列印出Hello world。但是很可惜,你犯了錯,實際上,它根本就通不過編譯。
問題在於注釋的第三行,它包含了字元\units。這些字元以反斜線(\)以及緊跟著的字母u開頭的,而它(\u)表示的是一個Unicode逸出字元的開始。遺憾的是,這些字元後面沒有緊跟四個十六進位的數字,因此,這個Unicode逸出字元是病構的,而編譯器則被要求拒絕該程式。Unicode逸出字元必須是良構的,即使是出現在注釋中也是如此。
在注釋中插入一個良構的Unicode逸出字元是合法的,但是我們幾乎沒有什麼理由去這麼做。程式員有時會在JavaDoc注釋中使用Unicode逸出字元來在文檔中產生特殊的字元。
// Unicode逸出字元在JavaDoc注釋中有問題的用法/** * This method calls itself recursively, causing a * StackOverflowError to be thrown. * The algorithm is due to Peter von der Ah\u00E9. */
這項技術表示了Unicode逸出字元的一種沒什麼用處的用法。在Javadoc注釋中,應該使用HTML實體逸出字元來代替Unicode逸出字元:
/** * This method calls itself recursively, causing a * StackOverflowError to be thrown. * The algorithm is due to Peter von der Ahé. */
前面的兩個注釋都應該是的在文檔中出現的名字為“Peter der Ahé”,但是後一個注釋在源檔案中還是可理解的。
可能你會感到很詫異,在這個謎題中,問題出在注釋這一資訊來源自一個實際的bug報告。該程式是機器產生的,這使得我們很難追蹤到問題的源頭——IDL-to-Java編譯器。為了避免讓其他程式員也陷入此境地,在沒有將Windows檔案名稱進行預先處理,以消除的其中的反斜線的情況下,工具應該確保不將Windows檔案名稱置於所產生的Java源檔案的注釋中。
總之,要確保字元\u不出現在一個合法的Unicode逸出字元上下文之外,即使是在注釋中也是如此。在機器產生的程式碼中要特別注意此問題。
謎題15:令人暈頭轉向的Hello