Java程序員慣性思維的一個(gè)錯(cuò)誤
很久沒(méi)有積累東西了,碰巧前幾天遇到一個(gè)的問(wèn)題,雖然不大但是比較有意思,在這里稍微記錄一下,以后可以作為面試題之類的考驗(yàn)其他人,想想也遠(yuǎn)比那些被我們?cè)嵅〉念}目要實(shí)際的多:
有表結(jié)構(gòu)如下:
- T_SOME_TABLE{
- crowid varchar(36);
- zrmb float(7,3);
- zjdw float(7,3);
- }
問(wèn)以下兩段代碼,哪段會(huì)出現(xiàn)錯(cuò)誤,為什么?
代碼片段一:
- //后臺(tái)代碼如下:
- String hqlStr="select SUM(t.zrmb) AS SUM_1,SUM(t.zjdw) AS SUM_2 from T_SOME_TABLE t where 1=1 ";
- List sumList=baseDao.find(hqlStr);//hibernate實(shí)現(xiàn)查詢HQL匯總語(yǔ)句返回結(jié)果List
- request.setAttribute("sumList",sumList);
- //前臺(tái)代碼如下:
- String sum1="";
- String sum2="";
- ArrayList sumList=request.getAttribute("sumList")==null?null:(ArrayList)request.getAttribute("sumList");
- if(null!=sumList){
- for(int i=0;i<sumList.size();i++){
- Object[] tempObj=(Object[])sumList.get(i);
- sum1=tempObj[0]==null?"0.0":tempObj[0].toString();
- sum2=tempObj[1]==null?"0.0":tempObj[1].toString();
- }
- }
- out.prinln("sum1:"+sum1);
- out.prinln("sum2:"+sum2);
代碼片段二:
- //后臺(tái)代碼如下:
- String hqlStr="select SUM(t.zrmb) AS SUM_1 from T_SOME_TABLE t where 1=1 ";
- List sumList=baseDao.find(hqlStr);//hibernate實(shí)現(xiàn)查詢HQL匯總語(yǔ)句返回結(jié)果List
- request.setAttribute("sumList",sumList);
- //前臺(tái)代碼如下:
- String sum1="";
- ArrayList sumList=request.getAttribute("sumList")==null?null:(ArrayList)request.getAttribute("sumList");
- if(null!=sumList){
- for(int i=0;i<sumList.size();i++){
- Object[] tempObj=(Object[])sumList.get(i);
- sum1=tempObj[0]==null?"0.0":tempObj[0].toString();
- }
- }
- out.prinln("sum1:"+sum1);
實(shí)際運(yùn)行會(huì)發(fā)現(xiàn) 代碼片段2會(huì)出現(xiàn)錯(cuò)誤 而代碼片段1是正常可以運(yùn)行的,這里是在功能開發(fā)過(guò)程中 片段2是在片段1的基礎(chǔ)上慣性思維去實(shí)現(xiàn)的,而實(shí)際運(yùn)行卻會(huì)發(fā)現(xiàn) 結(jié)果并不是想要的那樣,這個(gè)動(dòng)手能力強(qiáng)的人可以實(shí)際調(diào)試一下就會(huì)很快明白里面的所以然。這里簡(jiǎn)單說(shuō)一下:
做過(guò)hibernate的人都知道 用hibernate調(diào)用sql查詢出的匯總語(yǔ)句,返回的結(jié)果是封裝成Object的保存到List中的,而代碼1和代碼2相比較,差別只是在字段的多少上,如果是2個(gè)以上的字段 結(jié)果是封裝成Object[]數(shù)組的,這個(gè)無(wú)可爭(zhēng)議,但是如果是一個(gè)字段的話List里保存的是Object,而不是Object[]數(shù)組。
這樣就可以推論這里hibernate內(nèi)部是做了處理的。
代碼2循環(huán)中應(yīng)該是:
- Object tempObj=(Object)sumList.get(i);
- sum1=tempObj==null?"0.0":tempObj.toString();
原文鏈接:http://moonights.iteye.com/blog/1272980
【編輯推薦】