早上看了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循環(huán)有點(diǎn)奇怪,中間的那個(gè)表達(dá)式是空的。其實(shí)即使加上了條件,for (int i = 0; i<=iMax ; i++) 和源程序是一個(gè)效果的,純粹是多余的,但是我就是多余地加上了這條,結(jié)果編譯出錯(cuò)了!提示我沒有返回語句!

          我又重新編寫了兩個(gè)小程序來驗(yàn)證一下:
          下面這個(gè)能通過編譯:
          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循環(huán)的中間語句是空的。

          下面這個(gè)就不能編譯了:

          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());
              }
          }

          其實(shí)加上的語句并沒有改變?cè)瓉磉壿嫿Y(jié)構(gòu)。這是為什么呢?

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

          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的中間表達(dá)式加上一個(gè)恒等式,又能通過編譯了!!!這是為什么呢?請(qǐng)高手指點(diǎn)!
          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的改進(jìn)在哪里呢?我覺得1.5版的實(shí)現(xiàn)比較清晰,可讀性好一點(diǎn)。
          #  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: 有關(guān)方法返回一個(gè)很奇怪的問題!  回復(fù)  更多評(píng)論   

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


          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: 有關(guān)方法返回一個(gè)很奇怪的問題!  回復(fù)  更多評(píng)論   

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

          # re: 有關(guān)方法返回一個(gè)很奇怪的問題!  回復(fù)  更多評(píng)論   

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

          # re: 有關(guān)方法返回一個(gè)很奇怪的問題!  回復(fù)  更多評(píng)論   

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

          # re: 有關(guān)方法返回一個(gè)很奇怪的問題!  回復(fù)  更多評(píng)論   

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

          # re: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

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

          # re: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

          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!!!";
          }

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

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

          # re: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

          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: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

          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: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

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

          # re: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

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

          # re: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

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

          # re: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

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

          # re: 有關(guān)方法返回一個(gè)很奇怪的問題 - 問題已解決  回復(fù)  更多評(píng)論   

          2009-05-25 18:42 by 卡不過
          方法
          主站蜘蛛池模板: 拉孜县| 怀来县| 丹江口市| 德清县| 玉溪市| 宁明县| 辽源市| 那坡县| 柘荣县| 石景山区| 建德市| 屯留县| 乐东| 彰化市| 墨竹工卡县| 长岭县| 分宜县| 安丘市| 阿拉善盟| 鹤峰县| 齐齐哈尔市| 明水县| 理塘县| 莱西市| 四平市| 永城市| 浦城县| 德格县| 金川县| 西安市| 措勤县| 堆龙德庆县| 博野县| 阳泉市| 灌南县| 金塔县| 个旧市| 大荔县| 从化市| 吴堡县| 定远县|