JAVA EE 错误收集第二波

本文分享了一次耗时两小时的错误调试经历,主要涉及全局变量与局部变量的使用问题,详细解析了如何避免在循环中重复引用同一对象导致的数据错误,并提供了在不同情境下变量声明位置对程序运行结果的影响案例。
  (一)  今天晚上调试一个错误调试了两个多小时,功夫不负有心人,最终总算是被我给调出来了。这个错误的主要问题是关于全局变量与局部变量的使用方面。
    如下为调试的代码:
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 javax.servlet.ServletException;
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;
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();
 }

 public void init() throws ServletException {
  // Put your code here
 }
}
  一个变量有
   如下这般两种形式:如在外部用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(); 放在两个分支语句中则也是可以的。
 
5、 var name=document.all("btn1").value;
       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后问题迎刃而解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值