1. 程式人生 > >謎題15:令人暈頭轉向的Hello

謎題15:令人暈頭轉向的Hello

java title print cau html com rom 生成 斜杠

下面的程序是對一個老生常談的例子做出了稍許的變化之後的版本。那麽,它會打印出什麽呢?


/**

 * 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