技术中心

这里象征着我们的态度和能力

>Java程序员惯性思维的一个错误
发布者:中国IT实验室    信息来源:中国IT实验室    发布时间:2012-01-09      浏览次数:4824
分享到:

新浪微博

腾讯微博

QQ空间

豆瓣网

QQ好友

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

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

  有表结构如下:

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

4000-880-989
(24小时热线)
联系客服
微信公众号

官方公众号

小程序

©2008-2022 CORPORATION ALL Rights Reserved. 昆明奥远科技有限公司版权所有 滇ICP备09003328号-1 滇公网安备 53011102000818号
昆明那家网络公司好,新媒体运营,网站优化,网络推广,网站建设,网页设计,网站设计,网站推广,云南网站公司,昆明新媒体公司,云南网红主播,昆明SEO公司,昆明网站建设,昆明网络推广,昆明网站优化,昆明网站推广,红河网站建设,大理网络公司,曲靖网络公司,丽江网站设计,昭通网络公司,保山大数据服务,智慧高速建设,智慧校园服务,云南IDC服务商,网络安全测评,等保测评,网站关键词排名优化服务,服务客户尽超2000余家,一切尽在奥远科技,服务电话:13888956730