如何调试错误计数项目的程序?
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);
【讨论】:
如何通过qid? 嗯,最简单的方法是boolean ansercheck = cans.getans(Answer, i)
,但这取决于您如何在数据库中存储问题 ID。根据您的循环,它们是 1-4 的整数吗?如果它们可以是其他数字(例如,您从较大的数字中随机选择 4 个问题),那么您也需要将问题 ID 存储在表单中。然后您可以使用qid = request.getParameter("qid"+i)
将其退回。以上是关于如何调试错误计数项目的程序?的主要内容,如果未能解决你的问题,请参考以下文章
VS2013创建C#控制台程序,调试错误,尝试运行项目时出错:拒绝访问