Java 带ifs的嵌套for循环中的逻辑错误在哪里?

Java 带ifs的嵌套for循环中的逻辑错误在哪里?,java,playframework,ebean,Java,Playframework,Ebean,我已经安排了一些测验。首先,用户可以提问并回答问题。这些都保存在问答表中 如果此表中有足够的条目,则可以开始测验。测验通过问答表中的条目,随机选择一个问题并向用户提问。他的答案保存在测验表中 测验表中的条目将当前用户考虑在内,因此如果用户已经有条目(可能他之前已经被问过这个问题),那么答案将更新测验表中的条目。如果用户以前被问过这个问题,将在测验表中创建一个新条目 大多数方法或多或少都能起作用,但不知怎的,测验表中的条目没有更新,我也不明白为什么。那么我的逻辑错误在哪里呢 //Creates a

我已经安排了一些测验。首先,用户可以提问并回答问题。这些都保存在问答表中

如果此表中有足够的条目,则可以开始测验。测验通过问答表中的条目,随机选择一个问题并向用户提问。他的答案保存在测验表中

测验表中的条目将当前用户考虑在内,因此如果用户已经有条目(可能他之前已经被问过这个问题),那么答案将更新测验表中的条目。如果用户以前被问过这个问题,将在测验表中创建一个新条目

大多数方法或多或少都能起作用,但不知怎的,测验表中的条目没有更新,我也不明白为什么。那么我的逻辑错误在哪里呢

//Creates a list.The user answers the question via radiobuttons. 
//All quiz-entries that match the question_ID get put into the list. 
//Bob and Tim could have answere the same question, 
//so the question_ID could be in there several times
List<Quiz> tempQuizList = Quiz.find.where().like("question_ID", clickedRadioAnswer.questionID).findList();

User currentUser = request().name();

if( tempQuizList.size() > 0 ){
    // Go through all entries in the quiz-table
    for (Quiz quizItem : Quiz.find.all()) {
        // If the user from the quiz-table entry is the same as the current user
        if((quizItem.userID).equals(currentUser.email)){
            if(clickedRadioAnswer.answerID.equals(bestAnswer.answerID)){
                // If user has answered correctly, update the entry with the user and an interval to postpone the time when the user has to answer the question again
                Quiz.updateAnswer(clickedRadioAnswer.questionID, currentUser.email, 5000);
            } 
            else{
                Quiz.updateAnswer(clickedRadioAnswer.questionID, currentUser.email, 0);
            }
        }
        if(!(quizItem.userID).equals(currentUser.email)){
            if(clickedRadioAnswer.answerID.equals(bestAnswer.answerID)){
                Quiz.createAnswer(clickedRadioAnswer, currentUser, 5000);
            } 
            else{
                Quiz.createAnswer(clickedRadioAnswer, currentUser, 0);
            }
        }
    }
}
//创建一个列表。用户通过单选按钮回答问题。
//所有符合问题ID的测验条目都会被放入列表中。
//鲍勃和蒂姆本可以回答同样的问题,
//所以这个问题可能会出现好几次
List tempQuizList=quick.find.where()。类似(“问题ID”,clickedRadioAnswer.questionID)。findList();
User currentUser=request().name();
如果(tempQuizList.size()>0){
//检查测验表中的所有条目
for(quick-quizItem:quick.find.all()){
//如果测验表条目中的用户与当前用户相同
if((quizItem.userID).equals(currentUser.email)){
如果(单击RadioAnswer.answerID.equals(BestAnswerId)){
//如果用户回答正确,请使用用户更新条目,并设置一个时间间隔,以推迟用户再次回答问题的时间
quick.updateAnswer(单击radioanswer.questionID,currentUser.email,5000);
} 
否则{
quick.updateAnswer(单击radioanswer.questionID,currentUser.email,0);
}
}
if(!(quizItem.userID).equals(currentUser.email)){
如果(单击RadioAnswer.answerID.equals(BestAnswerId)){
quick.createAnswer(单击RadioAnswer,当前用户,5000);
} 
否则{
quick.createAnswer(单击RadioAnswer,当前用户,0);
}
}
}
}

我发现了一个非常糟糕的解决方案:

在我的for循环中,我会问,如果数据库中问题的用户与当前登录的用户相同。如果我在列表中添加另一个
.like()
,我的结构会变得更简单:

List<Quiz> tempQuizList = Quiz.find.where()
.like("question_ID", clickedRadioAnswer.questionID).findList();

我试图使用调试器,但发现实际上很难看到错误在哪里。相反,我和一个朋友通了电话,向他解释我在做什么。然后他指出,for循环太多了。我们一起找到了类似于双重的解决方案。它看起来不漂亮,但完成了任务。

你知道调试软件吗?这看起来完全像是一种问题,通过一步一步地处理它会更容易理解,就像调试器所做的那样。更新使用
currentUser。电子邮件
create使用
request().username()
不确定这是否符合设计要求。@blagae:我知道,但由于我使用的是play框架,它比平常要难一些。为了查看数据库中发生了什么,我必须键入
activator
。。。然后
h2浏览器
。但是要启动调试器,我不能使用
activator
然后
-jvm debug 9999 run
,因为他不知道这是一个命令。所以我启动调试会话时没有看到我的数据库。。。但在调试器中,有时当我按下
F6
或尝试跳转到类文件时,系统会挂起。因此,我主要使用
System.out.println(…)
来查看发生了什么,我把它们从我的问题中编辑了出来。@KennethClark:对不起,在那之前我是
User currentUser=request().username()
,所以它们是一样的。通过简化项目和/或模型来解决问题。看看你当前的迭代,如果有这些ifs,绝对不可能理解问题在哪里。
List<Quiz> tempQuizList = Quiz.find.where()
.like("question_ID", clickedRadioAnswer.questionID)
.like("user_id", currentUser.email).findList();
if( tempQuizList.size() > 0 ){              
    if(clickedRadioAnswer.answerID.equals(bestAnswer.answerID)){
        Quiz.updateAnswer(clickedRadioAnswer.questionID, currentUser.email, 5000);
    } 
    if(!clickedRadioAnswer.answerID.equals(bestAnswer.answerID)){
        Quiz.updateAnswer(clickedRadioAnswer.questionID, currentUser.email, 0);
    }
}

// Quiz is empty or user has no quizquestion open
if(tempQuizList.size() == 0){
    if(clickedRadioAnswer.answerID.equals(bestAnswer.answerID)){
    Quiz.createAnswer(clickedRadioAnswer, currentUser.email, 5000);
} 
else{
    Quiz.createAnswer(clickedRadioAnswer, currentUser.email, 0);
}