<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    早上看了java類庫中java.util.Arrays 類的toString方法的源代碼。如下:(這是JDK1.6的源代碼)
        public static String toString(long[] a) {
            
    if (a == null)
                
    return "null";
        
    int iMax = a.length - 1;
        
    if (iMax == -1)
                
    return "[]";

            StringBuilder b 
    = new StringBuilder();
            b.append(
    '[');
            
    for (int i = 0; ; i++) {
                b.append(a[i]);
            
    if (i == iMax)
            
    return b.append(']').toString();
                b.append(
    "");
            }
        }

    for循環有點奇怪,中間的那個表達式是空的。其實即使加上了條件,for (int i = 0; i<=iMax ; i++) 和源程序是一個效果的,純粹是多余的,但是我就是多余地加上了這條,結果編譯出錯了!提示我沒有返回語句!

    我又重新編寫了兩個小程序來驗證一下:
    下面這個能通過編譯:
    class Test{
        
    static String m(){
            
    int a =10;
            
    for (int i = 0; ; i++)
                
    if(i==a)
                    
    return "10";
        }
        
    public static void main (String[] args) {
            System.out.println (m());
        }
    }
    for循環的中間語句是空的。

    下面這個就不能編譯了:

    class Test{
        
    static String m(){
            
    int a =10;
            
    for (int i = 0; i<=a ; i++)
                
    if(i==a)
                    
    return "10";
        }
        
    public static void main (String[] args) {
            System.out.println (m());
        }
    }

    其實加上的語句并沒有改變原來邏輯結構。這是為什么呢?

    如果在for的外面加上一個return語句,隨便返回什么字符串,又能通過編譯了!!!這個字符串永遠不能輸出的!!!根本就是個擺設!!!

    class Test{
        
    static String m(){
            
    int a =10;
            
    for (int i = 0; i<=a ; i++)
                
    if(i==a)
                    
    return "10";
            
    return "never be touch!!!";
        }
        
    public static void main (String[] args) {
            System.out.println (m());
        }
    }


    另外如果像下面這樣在for的中間表達式加上一個恒等式,又能通過編譯了!!!這是為什么呢?請高手指點!
    class Test{
        
    static String m(){
            
    int a =10;
            
    for (int i = 0true==true ; i++)
                
    if(i==a)
                    
    return "10";
        }
        
    public static void main (String[] args) {
            System.out.println (m());
        }
    }


    附:這是JDK1.5的源碼,謝謝GrayWolf!
    1.6的代碼到底比1.5的改進在哪里呢?我覺得1.5版的實現比較清晰,可讀性好一點。
    #  public static String toString(long[] a) {
    if (a == null)
    return "null";
    if (a.length == 0)
    return "[]";
    #
    # StringBuilder buf 
    = new StringBuilder();
    # buf.append(
    '[');
    # buf.append(a[
    0]);
    #
    for (int i = 1; i < a.length; i++) {
    # buf.append(
    "");
    # buf.append(a[i]);
    # }
    #
    # buf.append(
    "]");
    return buf.toString();
    # }



    Feedback

    # re: 有關方法返回一個很奇怪的問題!  回復  更多評論   

    2007-11-01 19:12 by GrayWolf
    你的代碼有問題:
    http://www.javaresearch.org/source/index.html 這里有在線的源碼,就不用一個一個打上去了。哈哈。文章寫得還不錯。哎,自愧不如,看來,下次學新技術,我也得寫點東西出來了


    public static String toString(Object[] a) {
    if (a == null)
    return "null";
    if (a.length == 0)
    return "[]";

    StringBuilder buf = new StringBuilder();

    for (int i = 0; i < a.length; i++) {
    if (i == 0)
    buf.append('[');
    else
    buf.append(", ");

    buf.append(String.valueOf(a[i]));
    }

    buf.append("]");
    return buf.toString();
    }

    # re: 有關方法返回一個很奇怪的問題!  回復  更多評論   

    2007-11-01 19:18 by GrayWolf
    for循環有點奇怪,中間的那個表達式是空的。其實即使加上了條件,for (int i = 0; i<=iMax ; i++) 和源程序是一個效果的,純粹是多余的,但是我就是多余地加上了這條,結果編譯出錯了!提示我沒有返回語句!
    =======================================
    這里,你加了 i<=iMax ,for循環做完后,i = iMax + 1,所以你的
    if (i == iMax)
    return b.append(']').toString();
    這句永遠都不會執行到,所以編譯器就提醒你了。
    ========================================
    你的源碼是不是有問題,我看的在線的,for循環中間是有條件的。

    # re: 有關方法返回一個很奇怪的問題!  回復  更多評論   

    2007-11-01 19:35 by Raylong
    @GrayWolf
    我上面那段代碼是JDK1.6的,你的那個在線代碼網站提供的是1.5的。

    # re: 有關方法返回一個很奇怪的問題!  回復  更多評論   

    2007-11-01 21:53 by zhrb
    @GrayWolf
    不是這樣的,因為你的return語句在for里面,如果for中間加入任何判斷條件,除非這個判斷條件絕對為真(如空語句、ture、3>2),否則就有可能沒法執行到這個循環中的return語句,編譯器顯然不允許這種情況發生,所以當return語句只在循環體內出現,就不允許for循環中間的那個語句出現類似i<a這樣的充滿不確定性的判斷。簡單一句話,就是包含return的那個句子,至少要讓編譯器覺得,這個return是可以執行到的,以減少出錯的可能。
    不過即使這樣,還是架不住人們可能出現的語義上的錯誤,看下面這段代碼:
    public static int max(int a, int b){
    for(;;)
    if (false) return a>b?a:b;
    }
    從語義上分析,return是無論如何也執行不到的,但是編譯器看到for內的語句肯定可以執行,并且里面還有return語句,所以就想當然的認為沒錯。至于到底有沒有錯,自己回去想想、試試一下就知道了。呵呵

    # re: 有關方法返回一個很奇怪的問題!  回復  更多評論   

    2007-11-01 22:24 by Raylong
    @zhrb
    原來如此啊!看來是我過分高估編譯器的智能了,編譯器能在一定程度上減少程序出錯的可能。有時在一些細節上看起來比較笨拙……
    zhrb,謝謝非常詳細的解答!!!

    # re: 有關方法返回一個很奇怪的問題 - 問題已解決  回復  更多評論   

    2007-11-01 23:55 by zhrb
    @Raylong
    個人認為編譯器這樣設計肯定有他的道理
    編譯器就應該做他應該做的事請,涉及復雜的語義的東西還是交給程序員,自作聰明可能反而把事情搞得復雜起來.呵呵

    # re: 有關方法返回一個很奇怪的問題 - 問題已解決  回復  更多評論   

    2007-11-02 07:27 by Raylong
    static String m(){
    int a =10;
    for (int i = 0; i<=a ; i++)
    if(i==a)
    return "10";
    return "never be touch!!!";
    }

    是啊,我主要是覺得類似于上面的小程序,非要在最后加一個永遠到達不了的return語句才能通過編譯,看起來很不爽 呵呵 雖然這個小程序很容易改寫。

    我宿舍有一個學C++的,他做個同樣的試驗,結果超級暈!比java存在的問題還難以解釋,看來我們java的編譯器還是比較聰明的,比較嚴格的(相對而言)

    # re: 有關方法返回一個很奇怪的問題 - 問題已解決  回復  更多評論   

    2007-11-02 09:06 by zhrb
    @Raylong
    我是覺得奇怪,為什么要這樣寫
    for (int i = 0; ; i++) {
    b.append(a[i]);
    if (i == iMax)
    return b.append(']').toString();
    b.append(", ");
    }
    為什么不寫成

    for (int i = 0;i<iMax ; i++) {
    b.append(a[i]);
    if (i < iMax - 1 ) b.append(", ");
    }
    return b.append(']').toString();

    我感覺這樣更直觀啊。呵呵
    不知道是不是出于效率上的考慮呢?

    # re: 有關方法返回一個很奇怪的問題 - 問題已解決  回復  更多評論   

    2007-11-02 10:24 by 翔南
    我一般重寫toString都是向樓上那么寫的
    for (int i = 0;i<iMax ; i++) {
    b.append(a[i]);
    if (i < iMax - 1 ) b.append(", ");
    }
    return b.append(']').toString();

    以后可以借鑒java源代碼的寫法,不過那樣寫怎么就效率高了?

    # re: 有關方法返回一個很奇怪的問題 - 問題已解決  回復  更多評論   

    2007-11-02 11:19 by 翔南
    for (int i = 0; ; i++) {
    b.append(a[i]);
    if (i == iMax)
    return b.append(']').toString();
    b.append(", ");
    }
    只因為for里面的if只有一次為真,只執行一次if后的語句?

    # re: 有關方法返回一個很奇怪的問題 - 問題已解決  回復  更多評論   

    2007-11-02 11:26 by Raylong
    @zhrb
    是很奇怪,1.5版本的源碼也沒錯啊,新的版本也沒體現出高超的地方吧。為什么要重寫呢?

    # re: 有關方法返回一個很奇怪的問題 - 問題已解決  回復  更多評論   

    2007-11-02 11:30 by Raylong
    @翔南
    有可能是!而且我覺得比較大小的效率沒有比較相等的效率高!
    從位模式來看,比較大小要看這個數的全部,而比較是否相等就不一樣了,只要看到第一個bit不一樣就認定這兩個數不相等。
    不知道這么解釋對不對 呵呵
    如果是對的,那么細節就體現出水平了。

    # re: 有關方法返回一個很奇怪的問題 - 問題已解決  回復  更多評論   

    2007-11-02 20:49 by zhrb
    @Raylong
    事實上,如果用位模式來比較是否相等的話,只要對兩個數進行異或就好了,最多一次就好了
    比較大小的話,可能比較麻煩吧( 還要考慮符號位,最少一次吧 )
    可能真的是這樣.呵呵

    # re: 有關方法返回一個很奇怪的問題 - 問題已解決  回復  更多評論   

    2009-05-25 18:42 by 卡不過
    方法
    主站蜘蛛池模板: 亚洲AV乱码一区二区三区林ゆな | 亚洲欧美第一成人网站7777| 99久久综合精品免费| 亚洲综合精品网站在线观看| 无码 免费 国产在线观看91| 亚洲国产精品自产在线播放| 一个人看的www免费高清| 久久99亚洲综合精品首页| 久久成人永久免费播放| 国产精品亚洲аv无码播放| 久久精品视频免费看| 亚洲美免无码中文字幕在线| 在线观看免费中文视频| 亚洲五月综合缴情婷婷| 免费被黄网站在观看| 黄色a三级三级三级免费看| 中文字幕亚洲综合久久菠萝蜜| 两个人看的www免费视频中文| 精品亚洲综合久久中文字幕| 免费无码成人AV在线播放不卡| 亚洲精品一卡2卡3卡三卡四卡| 成人免费一级毛片在线播放视频| 亚洲人成色在线观看| 久久久久亚洲av成人无码电影| 国产一级片免费看| 亚洲人成777在线播放| 国产青草视频免费观看97| japanese色国产在线看免费| 国产AV无码专区亚洲精品| 无限动漫网在线观看免费| 羞羞视频免费网站日本| 亚洲AV日韩AV天堂久久| 午夜私人影院免费体验区| 国产精品1024在线永久免费 | 爱情岛亚洲论坛在线观看| 亚洲色偷偷偷鲁综合| 国产乱码免费卡1卡二卡3卡| 最新亚洲人成网站在线观看 | 亚洲天堂免费在线| 亚洲人成网站观看在线播放| 亚洲午夜免费视频|