Java程序员惯性思维的一个错误

发表于:2011-11-30 09:29

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:moonights    来源:51Testing软件测试网采编

  很久没有积累东西了,碰巧前几天遇到一个的问题,虽然不大但是比较有意思,在这里稍微记录一下,以后可以作为面试题之类的考验其他人,想想也远比那些被我们诟病的题目要实际的多:

  有表结构如下:

  • T_SOME_TABLE{ 
  • crowid varchar(36); 
  • zrmb float(7,3); 
  • zjdw float(7,3); 
  • }
  •   问以下两段代码,哪段会出现错误,为什么?

      代码片段一:

  • //后台代码如下: 
  •     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实现查询HQL汇总语句返回结果List 
  •     request.setAttribute("sumList",sumList); 
  • //前台代码如下: 
  •     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);
  •   代码片段二:

  • //后台代码如下: 
  •     String hqlStr="select SUM(t.zrmb) AS SUM_1  from T_SOME_TABLE t where 1=1 "
  •     List sumList=baseDao.find(hqlStr);//hibernate实现查询HQL汇总语句返回结果List 
  •     request.setAttribute("sumList",sumList); 
  • //前台代码如下: 
  •     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);
  •   实际运行会发现 代码片段2会出现错误 而代码片段1是正常可以运行的,这里是在功能开发过程中 片段2是在片段1的基础上惯性思维去实现的,而实际运行却会发现 结果并不是想要的那样,这个动手能力强的人可以实际调试一下就会很快明白里面的所以然。这里简单说一下:

      做过hibernate的人都知道 用hibernate调用sql查询出的汇总语句,返回的结果是封装成Object的保存到List中的,而代码1和代码2相比较,差别只是在字段的多少上,如果是2个以上的字段 结果是封装成Object[]数组的,这个无可争议,但是如果是一个字段的话List里保存的是Object,而不是Object[]数组。

      这样就可以推论这里hibernate内部是做了处理的。

      代码2循环中应该是:

  • Object tempObj=(Object)sumList.get(i);  
  • sum1=tempObj==null?"0.0":tempObj.toString();
  • 《2023软件测试行业现状调查报告》独家发布~

    关注51Testing

    联系我们

    快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

    法律顾问:上海兰迪律师事务所 项棋律师
    版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
    投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

    沪ICP备05003035号

    沪公网安备 31010102002173号