利用科学方法,可以通过一个可靠的过程来完成调试。这个科学方法包括以下几步:
① 观察:如果程序不能如期工作,就要进行观察。
② 假设:猜测为什么会产生非预期的行为。
③ 预测:预测代码修改或数据改变会对观察结果造成怎样的影响。
④ 测试:修改并观察结果,从而对以上预测进行测试。
然后反复进行这个过程,直到问题得到修正为止。下面先来看一个简单的例子。
实验:使用科学方法进行调试
这个例子中,JSP代码要打印从 –5 到 +5的数,每次递增1:
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>JSP Page</title></head>
<body>
<c:forEach var="counter" begin="1" end="10" step="1" >
<c:out value="${counter-5}"/><br/>
</c:forEach>
</body>
</html>
本章中,假设你已经为这些例子建立了基本的标准Web应用目录结构,而且JSP文件放在Web应用或WAR文件的根目录中,具体见第4章。
还需要在WEB-INF/lib目录安装jstl jar和standard.jar文件,另外WEB-INF/tld目录中要包含为部署应用提供支持的tld文件。需要配置web.xml文件以查找标记库描述文件。Web应用的配置见《JSP程序设计》第6章。
也可以下载本书的源代码文件,复制目录结构及其内容。
如果运行Tomcat来完成部署,应该能够在这个目录中编辑这些例子。如果使用了IDE,应该能在IDE中执行这些文件。
将页面命名为Example1.jsp。执行这个JSP时,会得到以下输出:
-4
-3
-2
-1
0
1
2
3
4
5
希望你已经发现了这里存在的问题:输出是从-4开始的,而不是我们希望的-5。为什么没有按我们的要求正确地输出呢?我们猜测可能是forEach 循环有问题,或者是c:out 语句中的数学运算出了错。通过分析代码,可以看到,counter=1时,counter-5 = -4。所以下一步要做一个实验,看看初始值设置为0而不是1的话,会出现什么情况。
将以下代码行:
<c:forEach var="counter" begin="1" end="10" step="1" >
修改为:
<c:forEach var="counter" begin="0" end="10" step="1" >
现在再执行代码就能得到所要的结果了。
实验解析
这是一个非常简单的例子,不过所有调试基本上都遵循这样一个过程。问题越复杂,就越难观察或者正确地预测。对于测试代码中发生的情况,如何得到更多的信息或者更好的理解是难点所在。







