程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java程序員慣性思維的一個錯誤

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

編輯:關於JAVA

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

有表結構如下:

  1. T_SOME_TABLE{
  2. crowid varchar(36);
  3. zrmb float(7,3);
  4. zjdw float(7,3);
  5. }

問以下兩段代碼,哪段會出現錯誤,為什麼?

代碼片段一:

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

代碼片段二:

  1. //後台代碼如下:
  2. String hqlStr="select SUM(t.zrmb) AS SUM_1 from T_SOME_TABLE t where 1=1 ";
  3. List sUMList=baseDao.find(hqlStr);//hibernate實現查詢HQL匯總語句返回結果List
  4. request.setAttribute("sUMList",sUMList);
  5. //前台代碼如下:
  6. String sum1="";
  7. ArrayList sUMList=request.getAttribute("sUMList")==null?null:(ArrayList)request.getAttribute("sUMList");
  8. if(null!=sUMList){
  9. for(int i=0;i<sUMList.size();i++){
  10. Object[] tempObj=(Object[])sUMList.get(i);
  11. sum1=tempObj[0]==null?"0.0":tempObj[0].toString();
  12. }
  13. }
  14. out.prinln("sum1:"+sum1);

實際運行會發現 代碼片段2會出現錯誤 而代碼片段1是正常可以運行的,這裡是在功能開發過程中 片段2是在片段1的基礎上慣性思維去實現的,而實際運行卻會發現 結果並不是想要的那樣,這個動手能力強的人可以實際調試一下就會很快明白裡面的所以然。這裡簡單說一下:

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

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

代碼2循環中應該是:

  1. Object tempObj=(Object)sUMList.get(i);
  2. sum1=tempObj==null?"0.0":tempObj.toString();
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved