如何调试错误计数项目的程序?

Posted

技术标签:

【中文标题】如何调试错误计数项目的程序?【英文标题】:How to debug a program that is counting items incorrectly? 【发布时间】:2018-04-14 08:50:06 【问题描述】:

我正在创建一个在线考试系统。我设法展示了问题并接受了答案并发布了答案以供检查。我的问题是,在检查结果为真后,它给了我错误的答案。

我有 4 个问题,选择所有正确答案后,它返回 3 分。我可以做些什么来调试问题?

Resultprocess.java

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 

          int count=0;
          for(int i=1;i<=4;i++) 
        String ans =request.getParameter("option"+i);
         System.out.println(ans);
            Answer Answer= new Answer();
            Answer.setAnswer(ans);
            CTest cans =new CTest();
            boolean ansercheck = cans.getans(Answer);
            if(ansercheck==true) 

                count++;    
            
        
          HttpSession session = request.getSession();
          String answer=Integer.toString(count);
          session.setAttribute("answer", answer); 

          response.sendRedirect("result.jsp");
        

CTest.java

public class CTest 
    Connection cn = null;
    PreparedStatement ps = null;
    Statement st = null;
    ResultSet rs = null;
    ConnectionFac con = new ConnectionFac();
    String selectans = "select Answer from ctest  ";
    public boolean getans( Answer answer) 

            try 
                rs = con.getResultSet(selectans);
                while(rs.next()) 

                    String answerDB = rs.getString(1);

                    Answer ansdb= new Answer();
                    ansdb.setAnswer(answerDB);

                    if(answer.equals(ansdb)) 
                        return true;    
                    
                

             catch (SQLException e) 

                e.printStackTrace();
               
        return false;
    

result.jsp

<div  class="col-sm-8" >
<form action="#">
<%
  String marks= (String)session.getAttribute("answer");
  out.print("<font size='5' color='White' >");
   out.print(" you got " +marks + " marks");
   out.print("</font>");
%>
</form>
  </div>

Answer.javagetter,setter and equals

package exam.DTO;

public class Answer 
    String answer;

    public String getAnswer() 
        return answer;
    

    public void setAnswer(String answer) 
        this.answer = answer;
    



    @Override
    public boolean equals(Object obj) 
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof Answer))
            return false;
        Answer other = (Answer) obj;
        if (answer == null) 
            if (other.answer != null)
                return false;
         else if (!answer.equals(other.answer))
            return false;
        return true;
    

【问题讨论】:

您发布了很多代码,其中包含一个非常模糊和不具体的问题。请花点时间描述您的问题并将您的代码缩减为minimal reproducible example。 这是一个经典的调试问题。通常我会建议将中间值打印到控制台,但Resultprocess.java 看起来像是 Web 进程的一部分。在这种情况下,我建议您将中间值发送到文件(以附加模式),这样您就可以看到正在发生的事情的“日志”。也就是说,我可以看到你已经有一个System.out.println(ans) - 你能在控制台上看到它吗?如果是这样,哪个循环迭代 (1-4) 行为错误? Yes System.out.println(ans) 在控制台上打印所有答案。 【参考方案1】:

啊,我发现了问题。这基本上是一个逻辑问题。

您希望CTest 为您提供关于答案是否正确的真/假。为此,您需要向它提供某种问题参考,以便它可以查找正确答案。

但是,您在本课程中所做的是循环回答答案,直到找到 任何 个匹配的答案。

例如,假设正确答案是:

    一个 B C D

而且测试中给出的答案都是错误的:

    D C B 一个

系统将能够找到这些答案中的每一个,因此将为每个答案返回真(正确)。我认为这不是您正在寻求的行为。

我认为你的错误首先在这里:

public boolean getans( Answer answer) 

这需要某种问题参考 - 一个 Question 实例,如果你有任何这样的东西,或者可能只是一个整数 ID。

然后您需要更改它以便将参数发送到其中(根据您的列名和如何在 Java 中进行参数化调整):

String selectans = "select Answer from ctest WHERE qid = ?";

最后,您需要在此处注入适当的问题 ID:

rs = con.getResultSet(selectans);

【讨论】:

如何通过q​​id? 嗯,最简单的方法是boolean ansercheck = cans.getans(Answer, i),但这取决于您如何在数据库中存储问题 ID。根据您的循环,它们是 1-4 的整数吗?如果它们可以是其他数字(例如,您从较大的数字中随机选择 4 个问题),那么您也需要将问题 ID 存储在表单中。然后您可以使用qid = request.getParameter("qid"+i) 将其退回。

以上是关于如何调试错误计数项目的程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何调试 TSLint 错误?

VS2013创建C#控制台程序,调试错误,尝试运行项目时出错:拒绝访问

idea导入别人的项目运行成功,怎么查看系统

如何解决 Rider docker 调试问题

无法在Web服务器上启动调试。基础连接已经关闭:接收时发生错误

如何在 Rider 中调试类库项目