程序调试方法
- 格式:doc
- 大小:40.50 KB
- 文档页数:4
程序调试方法李应洪2005-8-12一、CommConstants.java文件的写法,里面注意按模块写。
‘是’和‘否’用‘1’、‘0’二、Tomcat无法启动,先查看log,也行是java文件未完全编译,也有可能是web.xml或者Config.xml文件配置问题。
三、Java程序1.在发生异常的时候,我们是先尽快定位到关键的地方,如找不到,先不要急于每个方法里面去单步跟踪Step into,而是先在几个自认为可能出错的程序段上Step over,肯定会找出是某个段出现问题,然后在逐渐细化。
2.调试主要看一下几个关键点:设置断点Breakpoints,查看变量Variables,添加表达式Expressions,查看控制台console。
3.设置断点:一般是在关键地方设置断点,先找到关键点,然后将该关键点细化;再在关键点里面设置断点,依次找出Bug。
4.查看变量Variables:在程序运行的当前java类里面,可以查看该类里面的任何属性(包括Entity,Entity又有属性),这样一层一层的查看参数与变量的值。
5.单步跟踪到每个方法里面Step into,跟踪某个语句Step over,跟踪某方法侯返回Step return。
6.添加表达式:表达式其实是属于变量的一部分,当你想关注确定的变量的时候,可以通过添加表达式来调试更为直观。
7.查看控制台:控制台是我们找出Bug关键点的平台。
在控制台里面可以直接定位到某个文件的某个具体的方法或者某个语句,而且可以在控制台直接链接到对应的语句去。
8.Java文件的错误除了了在控制台会出现外,在Jsp页面还会出现。
在Jsp页面出现的Java文件的错误,也会表现的页面,同时会指出出错的地方。
定位到行代码。
9.Java程序出错频率最高的地方:1)空指针NullPoint,当一个class或者变量为null的时候,如果你在调用它的方法,系统会抛出空指针异常。
一般会有:a)rkdBiz= (CC_RkdBiz)BaseObjectFactory.getBaseObject("_RkdBiz");如果rkdBiz=null,再rkdBiz.insert();就会出现异常。
因此,需要先再ClassFactory.xml文件里面先配置实例化文件。
b)CC_RkdEntity rkdEntityTemp = this.selectRkd(conn, ryEntity, rkdEntity.getRkdID());if (rkdEntityTemp != null){// 组织数据rkdEntityTemp.setGysMc(rkdEntity.getGysMc());}c)for (int i = 0; i < rkdEntity.getRkdMxEntityArray().length; i++){//需要加上rkdEntity.getRkdMxEntityArray()!=null的判断}d)// 获得最大ID,转化为long型,赋值给实体对应的属性SequenceNoSeeker sequenceNoSeeker = new SequenceNoSeeker();rkdEntity.setRkdID(Long.valueOf(sequenceNoSeeker.nextSequenceNo(conn,"BIZ_RKD", null).toString())如果没有再Sequence.xml文件里面配置sequence就会抛出空指针异常。
e)// 入库单主单实体private CC_RkdEntity rkdEntity = new CC_RkdEntity();在Form里面如果定义一个实体的时候,没有new的话,在Jsp页面上使用<html:text property="rkdEntity.rkdBh" styleClass="editor" ></html:text>会抛出空指针异常。
f)// 物资编码private String[] strWzbm = null;在Form里为了组织Jsp页面提交的数据,定义数组字符串,如果得到的数组为null,再使用rkdEntity[i].setWzbm(strWzbm[nIndex]);就会抛出空指针异常。
因此,再Form里面定义的数组命名必须与Jsp页面使用的一样。
比如:Jsp使用<html:hidden name="rkdMxEntity" property="rkdMxBh" write="true"/>那么:Form里面就得String[] strRkdMxBh = null;2)SQL异常,肯定都是Dao里面书写错误。
a)字段的个数与“?”的格式不等b)缺少或者多“,”c)缺少或者多“(”d)Dae类型的字段忘记了to_date(?,’ yyyy-mm-dd’)e)sbWhere.append(" RKDBH ="+ SqlReplace.sqlReplace(rkdEntity.getRkdBh(),SqlReplace.BLUR_SEARCH_V ALIDATE) + " and "); 象这样的也会出现异常。
f)where条件里面缺少连接符“and”等其实这些问题都是比较低级的错误,大家再Copy别人的代码的时候要千万注意,因此要求每个人再写Sql的时候统一风格,并写明注释。
3)查询得不到想到的结果a)Dao里面指定的返回Entity和自己想要的返回Entity不一致。
如:objs = SqlUtil.parseDataEntityBeans(rs, "", "_RkdEntity");或者Entity的路径写错,Entity的名字写错,都会出现这种情况。
这种异常不会抛出来的,而且再控制台打印出来的SQL拿到数据库去执行不会发生任何异常。
一旦发生这种情况,需要先执行打印出来的SQL,然后跟踪查询结果返回的Entity是否有值。
b)查询出来了结果,但是Entity的某些属性(某些列)的值不是自己所希望的。
可能是Entity里面的方法写的有问题,多数情况是赋错了变量。
public void setGysMc(String gysMc){strGysMc = gysMc;}从数据库执行查询后,给实体赋值都是通过Entity里面的“set”方法。
c)情况a)、b)都没发生,但是Jsp页面就是去不到某个属性的值,这种情况就是“get”方法有问题,因为我们再页面取值都是通过“get”方法。
d)如果是long、double类型的属性,再页面没法取值,最有可能的就是没有重载“set”方法。
如:public void setZt(BigDecimal dbZt){lZt = dbZt.longValue();}e)查询语句都是通过sql的别名来赋值给Entity属性的,因此在写sql的时候需要写别名。
f)如果pageLoader出错,可能是没有取别名,也可能是order by方法的排序字段写错了(写成了该表中不存在的字段)。
这种情况需要跟踪到PageLoader里面去。
调试方法:// 得到PageLoaderpageLoader = rkdBiz.selectRkdList(null, ryEntity, rkdEntity);// 获取页面的排序方式pageLoader.setOrderBy(rkdForm.getRkdEntity().getOrderBy());// 将第一页放到FormrkdForm.setRkdEntityArray((CC_RkdEntity[]) pageLoader.firstPage());先看step over到pageLoader = rkdBiz.selectRkdList(null, ryEntity, rkdEntity);是否有异常,如没有;需要Step into跟踪到firstPage()里面4)出现业务逻辑错误或者赋值错误,这才是最难调试的Bug。
这种情况需要按照程序段来跟踪,不停的查看Variables,进行单步跟踪。
5)在人为构造数据的时候,也要注意构造的数据是否合法,是否适合用来进行测试。
同时记住构造数据后,要Commit.6)在调试程序的时候,如果发生错误,仍然要把程序执行完成;以避免数据库的死锁。
四、Jsp页面错误1.出现白页先查看是否连接出错,或者Config文件配置错误。
或者是Jsp页面上的“.do“文件指定错误还有可能是action里面的Forward路径有错。
2.页面显示不全。
基本上是因为页面Tag书写错误。
或者是html标签不对应,少了和多了标签。
因此希望大家在写Jsp页面的时候参照sample来写。
其实每个Jsp页面都是有几个部分组成的,这些部分都已经有模板。
当出现错误时,调试Jsp页面的可以一段一段调试。
3.Jsp页面抛异常可能是没有引入Java类文件、css、div等。
可能是Entity的属性在页面书写错误,大小写错误等。
4.Jsp页面还种最糟糕的错误。
实现功能:循环显示明细数组,正确的写法:<logic:notEmpty name="rkdForm" property="rkdMxEntityArray"><logic:iterate id="rkdMxEntity" name="rkdForm" property="rkdMxEntityArray"type="_RkdMxEntity" offset="0" indexId="nColorIndex"><tr class="row_even"><td class="tablecell" align="center"><html:hidden name="rkdMxEntity" property="rkdMxBh" write="true"/></td></tr></logic:iterate></logic:notEmpty>错误的写法:<logic:notEmpty property="rkdMxEntityArray"><logic:iterate id="rkdMxEntity" name="rkdForm" property="rkdMxEntityArray"type="_RkdMxEntity" offset="0" indexId="nColorIndex"><tr class="row_even"><td class="tablecell" align="center"><html:hidden property=" rkdMxEntity.rkdMxBh" write="true"/></td></tr></logic:iterate></logic:notEmpty>实现功能:显示主表信息,正确写法:<html:text property="rkdEntity.zt" styleClass="editor" ></html:text>错误写法:<html:text name=” rkdEntity” property="zt" styleClass="editor" ></html:text> 5.JavaScript的书写和调试,大家使用的时候可以查参考资料,在vss上有。