You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:45:04