(一) 今天晚上调试一个错误调试了两个多小时,功夫不负有心人,最终总算是被我给调出来了。这个错误的主要问题是关于全局变量与局部变量的使用方面。
如下为调试的代码:
package cn.com.DoServlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.com.DBOperation.DBConnection;
import cn.com.vo.ClassmatersVo;
import cn.com.vo.ClassmatersVo;
public class QueryClassmatersInfo extends HttpServlet {
public QueryClassmatersInfo() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String sql = "select * from classmaters";
Connection conn = null;
PreparedStatement pstmt=null;
ResultSet rs = null;
List list = new ArrayList();
//List list = null;//采用此种方式list长度就变为1
ClassmatersVo stuVo =null;
//new ClassmatersVo();//但是若两个变量都在此处new,则返回相同的记录
try{
conn = DBConnection.getDBConnection();
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()){
//list = new ArrayList();
stuVo = new ClassmatersVo();
stuVo.setNumber(rs.getInt("id"));
System.out.println("重复问题排错:"+stuVo.getNumber());//此处打印正确
stuVo.setClassNum(rs.getString("class"));
stuVo.setName(rs.getString("name"));
stuVo.setIdcard(rs.getString("idcard"));
stuVo.setSex(rs.getString("sex"));
list.add(stuVo);
}
// stuVo =(ClassmatersVo)list.get(0);
// ClassmatersVo MyVo = (ClassmatersVo)list.get(1);
// System.out.println("list[0]的取值为:"+stuVo.getName());
// System.out.println("list[1]的取值为:"+MyVo.getName());
}catch(Exception e){
System.out.println("查询同学信息表失败");
e.printStackTrace();
}finally{
try {
rs.close();
pstmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//将查询到的数据显示在表格中
response.setCharacterEncoding("gb2312");
PrintWriter pw = response.getWriter();
pw.println("<body>");
pw.println("<table border='1' align='center'>");
pw.println("<tr><td>学号</td><td>班级</td><td>姓名</td><td>身份证</td><td>性别</td></tr>");
System.out.println("list的长度为:"+list.size());//长度测试正确
for(int i=0; i<list.size();i++){
//ClassmatersVo MyVo //为什么显示的总是同一行(第一条记录)数据
stuVo =(ClassmatersVo)list.get(i);
pw.println("<tr><td>"+stuVo.getNumber()+"</td>");
pw.println("<td>"+stuVo.getClassNum()+"</td>");
pw.println("<td>"+stuVo.getName()+"</td>");
pw.println("<td>"+stuVo.getIdcard()+"</td>");
pw.println("<td>"+stuVo.getSex()+"</td></tr>");
}
pw.println("</table></body>");
pw.close();
}
Connection conn = null;
PreparedStatement pstmt=null;
ResultSet rs = null;
List list = new ArrayList();
//List list = null;//采用此种方式list长度就变为1
ClassmatersVo stuVo =null;
//new ClassmatersVo();//但是若两个变量都在此处new,则返回相同的记录
try{
conn = DBConnection.getDBConnection();
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()){
//list = new ArrayList();
stuVo = new ClassmatersVo();
stuVo.setNumber(rs.getInt("id"));
System.out.println("重复问题排错:"+stuVo.getNumber());//此处打印正确
stuVo.setClassNum(rs.getString("class"));
stuVo.setName(rs.getString("name"));
stuVo.setIdcard(rs.getString("idcard"));
stuVo.setSex(rs.getString("sex"));
list.add(stuVo);
}
// stuVo =(ClassmatersVo)list.get(0);
// ClassmatersVo MyVo = (ClassmatersVo)list.get(1);
// System.out.println("list[0]的取值为:"+stuVo.getName());
// System.out.println("list[1]的取值为:"+MyVo.getName());
}catch(Exception e){
System.out.println("查询同学信息表失败");
e.printStackTrace();
}finally{
try {
rs.close();
pstmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//将查询到的数据显示在表格中
response.setCharacterEncoding("gb2312");
PrintWriter pw = response.getWriter();
pw.println("<body>");
pw.println("<table border='1' align='center'>");
pw.println("<tr><td>学号</td><td>班级</td><td>姓名</td><td>身份证</td><td>性别</td></tr>");
System.out.println("list的长度为:"+list.size());//长度测试正确
for(int i=0; i<list.size();i++){
//ClassmatersVo MyVo //为什么显示的总是同一行(第一条记录)数据
stuVo =(ClassmatersVo)list.get(i);
pw.println("<tr><td>"+stuVo.getNumber()+"</td>");
pw.println("<td>"+stuVo.getClassNum()+"</td>");
pw.println("<td>"+stuVo.getName()+"</td>");
pw.println("<td>"+stuVo.getIdcard()+"</td>");
pw.println("<td>"+stuVo.getSex()+"</td></tr>");
}
pw.println("</table></body>");
pw.close();
}
public void init() throws ServletException {
// Put your code here
}
}
一个变量有
如下这般两种形式:如在外部用AAA aa = null;在内部用aa = new AAA();或者在外部用AAA aa=new AAA();在内部用aa=...。两个变量就总共会有四种不同的组合。
如下这般两种形式:如在外部用AAA aa = null;在内部用aa = new AAA();或者在外部用AAA aa=new AAA();在内部用aa=...。两个变量就总共会有四种不同的组合。
我调试了很久才想到将其进行不同的组合, 当我尝试到第三种组合的时候(也即上面代码的最终形式)时成功了, 但是我还分析不出具体的原因。
加油! 这个问题值得继续研究...
分析如下: 如果在外面 ClassmatersVo stuVo = new ClassmatersVo ()。那么就意味着只创建了一个ClassmatersVo 对象, 所以在循环输出时就总是同一条记录了;而如果List list = new ArrayList()放在里面的话那么就每循环一次list都会被重新创建一次,最后保存的就是查询出的结果集中的最后一条记录。
2、pw.println("<td>"+"<a href='DoDeleteServlet?cardid="+stuVo.getNumber()+"'>"+"删除"+"</a></td></tr>");
上述语句是我通过超链接的方式向Servlet传递数据, 但是之前在Servlet中打印出来的数据老是不正确,经排查原来是上述语句中的双引号与单引号的位置没有摆好。
3、在多个Servlet之间进行链接时, 下一个Servlet的地址是相对于前一个Servlet而言的, 也即采用的相对路径的方式。
4、在JS中如下使用时错误的:
var name=document.all("btn1").value;
document.write(name);
//提交表单数据
document.all("myform").submit(); 当我将第二条语句给注释掉时就能正常地提交。如果将document.write(name);
与 document.all("myform").submit(); 放在两个分支语句中则也是可以的。
document.write(name);
//提交表单数据
document.all("myform").submit(); 当我将第二条语句给注释掉时就能正常地提交。如果将document.write(name);
与 document.all("myform").submit(); 放在两个分支语句中则也是可以的。
5、 var name=document.all("btn1").value;
document.write(name);
document.write(name);
document.getElementById("yincang").value=name; 一起出现时,就抛出了与4同样的异常:
错误: 'document.getElementById(...)' 为空或不是对象, 当我把 document.write(name);给注释掉时问题就 又解决了。
这是为什么呢?
6、 低级失误之:
document.getElementById("hid").value=name;
document.getElementsByName("hid")=name 然后我再另外一个变量通过getParameter()的方式去接收“hid”所代表隐藏域的值总是返回null或者说是undefined. 查找了几个小时,后来还是同学发现的我在document.getElementsByName("hid")后少了个value. 当加上.value后问题迎刃而解。
本文分享了一次耗时两小时的错误调试经历,主要涉及全局变量与局部变量的使用问题,详细解析了如何避免在循环中重复引用同一对象导致的数据错误,并提供了在不同情境下变量声明位置对程序运行结果的影响案例。

被折叠的 条评论
为什么被折叠?



