Java测验应用JUnit测试全部通过 运行main方法无法启动程序 如何排查?
程序无法启动的核心原因
你遇到的启动失败问题是Quiz类构造方法无限递归导致的栈溢出,这是直接导致程序跑不起来的致命错误:
public class Quiz { Quiz qz; // 只要实例化Quiz,就会在构造方法里再创建新的Quiz实例,无限循环调用构造方法,直接抛出StackOverflowError public Quiz() { qz = new Quiz(); } }
只要主流程走到需要实例化Quiz的逻辑(比如QuizQuestions里的askQuestionsOneByOne方法调用new Quiz()),程序就会直接崩溃。你的JUnit测试能通过,是因为测试的大多是不需要实例化Quiz的独立方法(比如获取题目列表、获取正确答案列表这类),没有触发到这个递归逻辑。
其他隐藏逻辑错误
修复完构造方法问题后,你还会遇到业务逻辑错误,也需要一并修正:
1. 答案对比逻辑写反
compareAnswers方法把用户答案和正确答案的赋值搞反了,对比完全无效:
// 原错误逻辑 public int compareAnswers() { ArrayList<String> userAnswers = storeCorrectAnswers(); ArrayList<String> correctAnswers = askQuestionsOneByOne(); // ... }
2. 分数打印逻辑完全错误
printScore方法里新建了独立的QuizQuestions实例,和当前用户答题的实例数据完全无关,还会重复触发答题流程:
// 原错误逻辑 public void printScore() { QuizQuestions qq = new QuizQuestions(); int score = qq.compareAnswers(); System.out.println("Your score is " + score); }
3. 主方法流程重复调用
main方法里重复调用了askQuestionsOneByOne、compareAnswers等方法,这些方法本身已经被后续流程内部调用,会导致用户需要多次重复答题。
完整修复方案
1. 修复Quiz类无限递归
删除Quiz类无用的成员变量和错误的构造逻辑:
public class Quiz { // 删掉Quiz qz; 这行无用声明 // 删掉自定义的构造方法,使用默认无参构造即可 // 其余方法保留,仅修改printScore方法如下 public void printScore(int score) { System.out.println("Your score is " + score); } }
2. 修正答案对比逻辑
修改QuizQuestions类的compareAnswers方法:
public int compareAnswers() { ArrayList<String> correctAnswers = storeCorrectAnswers(); ArrayList<String> userAnswers = askQuestionsOneByOne(); int score = 0; for (int i = 0; i < userAnswers.size(); i++) { // 新增忽略大小写判断,提升用户体验 if (userAnswers.get(i).equalsIgnoreCase(correctAnswers.get(i))) { score++; } } return score; }
3. 修正分数调用逻辑
修改QuizQuestions类的displayScoreAndPerformanceMessage方法中调用printScore的代码:
public void displayScoreAndPerformanceMessage() { quiz = new Quiz(); int score = compareAnswers(); quiz.printScore(score); // 传入当前计算好的分数,不需要Quiz自己再计算 // 剩余分支逻辑保持不变 }
4. 简化主方法流程
修改Main类的main方法,删除冗余调用:
public class Main { public static void main(String[] args) { QuizQuestions qq = new QuizQuestions(); qq.entireQuestionsList(); qq.displayScoreAndPerformanceMessage(); } }
内容的提问来源于stack exchange,提问作者Adwait Kulkarni
相关产品推荐
相关产品推荐

