程序调试方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序调试方法
李应洪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页面上使用
异常。
f)// 物资编码
private String[] strWzbm = null;
在Form里为了组织Jsp页面提交的数据,定义数组字符串,如果得到的数组为null,再使用rkdEntity[i].setWzbm(strWzbm[nIndex]);就会抛出空指针异常。
因此,再Form里面定义的数组命名必须与Jsp页面使用的一样。
比如:Jsp使用
那么: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)
{