qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Java程序員慣性思維的一個錯誤

           很久沒有積累東西了,碰巧前幾天遇到一個的問題,雖然不大但是比較有意思,在這里稍微記錄一下,以后可以作為面試題之類的考驗其他人,想想也遠比那些被我們詬病的題目要實際的多:

            有表結構如下:

        1. T_SOME_TABLE{ 
        2. crowid varchar(36); 
        3. zrmb float(7,3); 
        4. zjdw float(7,3); 
        5. }
        6.   問以下兩段代碼,哪段會出現錯誤,為什么?

            代碼片段一:

        7. //后臺代碼如下: 
        8.     String hqlStr="select SUM(t.zrmb) AS SUM_1,SUM(t.zjdw) AS SUM_2 from T_SOME_TABLE t where 1=1 "
        9.     List sumList=baseDao.find(hqlStr);//hibernate實現查詢HQL匯總語句返回結果List 
        10.     request.setAttribute("sumList",sumList); 
        11. //前臺代碼如下: 
        12.     String sum1=""
        13.     String sum2=""
        14.     ArrayList sumList=request.getAttribute("sumList")==null?null:(ArrayList)request.getAttribute("sumList"); 
        15.     if(null!=sumList){ 
        16.         for(int i=0;i<sumList.size();i++){ 
        17.             Object[] tempObj=(Object[])sumList.get(i); 
        18.             sum1=tempObj[0]==null?"0.0":tempObj[0].toString(); 
        19.             sum2=tempObj[1]==null?"0.0":tempObj[1].toString(); 
        20.         } 
        21.     } 
        22.     out.prinln("sum1:"+sum1); 
        23.     out.prinln("sum2:"+sum2);
        24.   代碼片段二:

        25. //后臺代碼如下: 
        26.     String hqlStr="select SUM(t.zrmb) AS SUM_1  from T_SOME_TABLE t where 1=1 "
        27.     List sumList=baseDao.find(hqlStr);//hibernate實現查詢HQL匯總語句返回結果List 
        28.     request.setAttribute("sumList",sumList); 
        29. //前臺代碼如下: 
        30.     String sum1=""
        31.     ArrayList sumList=request.getAttribute("sumList")==null?null:(ArrayList)request.getAttribute("sumList"); 
        32.     if(null!=sumList){ 
        33.         for(int i=0;i<sumList.size();i++){ 
        34.             Object[] tempObj=(Object[])sumList.get(i); 
        35.             sum1=tempObj[0]==null?"0.0":tempObj[0].toString(); 
        36.         } 
        37.     } 
        38.     out.prinln("sum1:"+sum1);
        39.   實際運行會發現 代碼片段2會出現錯誤 而代碼片段1是正常可以運行的,這里是在功能開發過程中 片段2是在片段1的基礎上慣性思維去實現的,而實際運行卻會發現 結果并不是想要的那樣,這個動手能力強的人可以實際調試一下就會很快明白里面的所以然。這里簡單說一下:

            做過hibernate的人都知道 用hibernate調用sql查詢出的匯總語句,返回的結果是封裝成Object的保存到List中的,而代碼1和代碼2相比較,差別只是在字段的多少上,如果是2個以上的字段 結果是封裝成Object[]數組的,這個無可爭議,但是如果是一個字段的話List里保存的是Object,而不是Object[]數組。

            這樣就可以推論這里hibernate內部是做了處理的。

            代碼2循環中應該是:

        40. Object tempObj=(Object)sumList.get(i);  
        41. sum1=tempObj==null?"0.0":tempObj.toString();
        42. posted on 2011-11-30 10:57 順其自然EVO 閱讀(138) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2011年11月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宣化县| 九江市| 五指山市| 巴彦淖尔市| 洞头县| 石台县| 兰西县| 宜春市| 那坡县| 甘孜| 榆林市| 双牌县| 黑山县| 南部县| 和顺县| 宁南县| 二连浩特市| 富民县| 临清市| 贵州省| 类乌齐县| 玉山县| 苍梧县| 宁明县| 长丰县| 上栗县| 河西区| 巨鹿县| 温宿县| 黄冈市| 凤阳县| 衢州市| 扶风县| 荥经县| 崇义县| 阿巴嘎旗| 洪洞县| 卓尼县| 资中县| 上蔡县| 大安市|