早上看了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 卡不過
          方法
          主站蜘蛛池模板: 鹰潭市| 三江| 塔城市| 安顺市| 阳谷县| 咸宁市| 云南省| 库尔勒市| 安福县| 洞头县| 固安县| 巴楚县| 洛阳市| 常熟市| 溧阳市| 黎平县| 许昌市| 高雄市| 夏邑县| 白山市| 华容县| 昔阳县| 自治县| 荣成市| 贵州省| 彩票| 呼玛县| 沁阳市| 利川市| 理塘县| 丰都县| 河南省| 遂川县| 浦城县| 许昌市| 石楼县| 馆陶县| 图片| 通城县| 鸡东县| 界首市|