社区编辑申请
注册/登录
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. //前台代码如下: 
  7.     String sum1=""
  8.     String sum2=""
  9.     ArrayList sumList=request.getAttribute("sumList")==null?null:(ArrayList)request.getAttribute("sumList"); 
  10.     if(null!=sumList){ 
  11.         for(int i=0;i<sumList.size();i++){ 
  12.             Object[] tempObj=(Object[])sumList.get(i); 
  13.             sum1=tempObj[0]==null?"0.0":tempObj[0].toString(); 
  14.             sum2=tempObj[1]==null?"0.0":tempObj[1].toString(); 
  15.         } 
  16.     } 
  17.     out.prinln("sum1:"+sum1); 
  18.     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. //前台代码如下: 
  7.     String sum1=""
  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.         } 
  14.     } 
  15.     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(); 

原文链接:http://moonights.iteye.com/blog/1272980

【编辑推荐】

  1. 高手真经 13条Java核心技术
  2. 去故就新 Java线程新同步机制
  3. Java的ClassLoader机制解析
  4. 精解Java中代理模式的实现
  5. Java常量池详解之抓狂的面试题
责任编辑:林师授 来源: moonights的博客
相关推荐

2022-07-15 08:20:54

Java基础知识

2021-06-04 10:15:17

JavaSQL编程语言

2016-01-11 11:32:41

2011-02-23 10:39:56

Java程序员Java开发

2018-09-29 16:10:02

2020-01-06 09:14:59

Java程序员线程

2011-04-01 15:35:15

Java程序员

2014-07-29 10:30:16

2021-09-02 08:40:10

2020-09-10 15:16:38

Java程序员代码

2015-08-27 16:15:10

程序员面试错误

2017-09-15 11:28:55

2015-10-08 15:57:30

程序员错误

2011-07-06 08:49:05

程序员

2019-01-23 17:53:05

程序员技能沟通

2017-09-14 10:02:36

程序员体验验证

2011-05-30 14:50:56

2015-07-29 10:46:20

2019-07-08 13:58:03

Java数据结构设计

2011-07-21 11:19:51

JAVA

同话题下的热门内容

超全!Python图形界面框架PyQt5使用指南!太强了!Python 开发桌面小工具,让代码替我们干重复的工作!Python居然被用来开发游戏了?盘点你想不到的Python开发场景浅谈Python+requests+pytest接口自动化测试框架的搭建跟着 Guava 学 Java 之 不可变集合Python轻量级Web框架:Bottle库!用 Taichi 加速 Python:提速 100+ 倍!实战 | 如何用 Python 自动化监控文件夹完成服务部署!

编辑推荐

使用Kotlin做开发一个月后的感想面试官问你什么是消息队列?把这篇甩给他!五大自动化测试的Python框架图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)2018年最流行的十大编程语言,其中包括你用的语言吗?
我收藏的内容
点赞
收藏

51CTO技术栈公众号