JAVA字符謎題9:漂亮的火花

字號(hào):

下面的程序用一個(gè)方法對(duì)字符進(jìn)行了分類。這個(gè)程序會(huì)打印出什么呢?
    public class Classifier {
     public static void main(String[] args) {
     System.out.println(
     classify(’n’) + classify(’+’) + classify(’2’));
     }
     static String classify(char ch) {
     if ("0123456789".indexOf(ch) >= 0)
     return "NUMERAL ";
     if ("abcdefghijklmnopqrstuvwxyz".indexOf(ch) >= 0)
     return "LETTER ";
     /* (Operators not supported yet)
     if ("+-*/&|!=" >= 0)
     return "OPERATOR ";
     */
     return "UNKNOWN";
     }
    }
     如果你猜想該程序?qū)⒋蛴ETTER UNKNOWN NUMERAL,那么你就掉進(jìn)陷阱里面了。這個(gè)程序連編譯都通不過。讓我們再看一看相關(guān)的部分,這一次我們用粗體字突出注釋部分:
    if ("abcdefghijklmnopqrstuvwxyz".indexOf(ch) >= 0)
     return "LETTER ";
     /* (Operators not supported yet)
     if ("+-*/&|!=" >= 0)
     return "OPERATOR ";
     */
     return "UNKNOWN";
     }
    }
     正如你之所見,注釋在包含了字符*/的字符串內(nèi)部就結(jié)束了,結(jié)果使得程序在語法上變成非法的了。我們將程序中的一部分注釋出來的嘗試之所以失敗了,是因?yàn)樽址置娉A吭谧⑨屩袥]有被特殊處理。
    更一般地講,注釋內(nèi)部的文本沒有以任何方式進(jìn)行特殊處理[JLS 3.7]。因此,塊注釋不能嵌套。請(qǐng)考慮下面的代碼段:
    /* Add the numbers from 1 to n */
    int sum = 0;
    for (int i = 1; I <= n; i++)
    sum += i;
    現(xiàn)在假設(shè)我們要將該代碼段注釋成為一個(gè)塊注釋,我們再次用粗體字突出整個(gè)注釋:
    /*
    /* Add the numbers from 1 to n */
    int sum = 0;
    for (int i = 1; I <= n; i++)
    sum += i;
    */
     正如你之所見,我們沒有能夠?qū)⒆畛醯拇a段注釋掉。好在所產(chǎn)生的代碼包含了一個(gè)語法錯(cuò)誤,因此編譯器將會(huì)告訴我們代碼存在著問題。
    你可能偶爾看到過這樣的代碼段,它被一個(gè)布爾表達(dá)式為常量false的if語句禁用了:
    //code commented out with an if statement - doesn’t always work!
    if (false) {
     /* Add the numbers from 1 to n */
     int sum = 0;
     for (int i = 1; i <= n; i++)
     sum += i;
    }
     語言規(guī)范建議將這種方式作為一種條件編譯技術(shù)[JLS 14.21],但是它不適合用來注釋代碼。除非要被禁用的代碼是一個(gè)合法的語句序列,否則就不要使用這項(xiàng)技術(shù)。
    注釋掉一個(gè)代碼段的的方式是使用單行的注釋序列。大多數(shù)IDE工具都可以自動(dòng)化這個(gè)過程:
    //code commented out with an if statement - doesn’t always work!