为什么这个switch语句没有识别subString?

时间:2013-12-08 08:40:30

标签: java switch-statement substring

我正在创建一个类Course,它表示一个包含三个属性courseIDletterGradenumberGrade的Course对象。

numberGrade使用letterGrade方法从computeGrade()计算得出。我目前正在测试我的Course类,并发现computeGrade中使用的switch语句无法识别相关的substring

为什么会这样?

public void computeGrade() {
    switch (letterGrade.substring(0,1)) {
        case "A": numberGrade = 4.0;
        case "B": numberGrade = 3.0;
        case "C": numberGrade = 2.0;
        case "D": numberGrade = 1.0;
        case "F": numberGrade = 0.0;
        default: numberGrade = 999;
    }
    if(letterGrade.endsWith("+") && !letterGrade.startsWith("A") && !letterGrade.startsWith("F")) {
        numberGrade += 0.3;
    }
    else if(letterGrade.endsWith("-") && !letterGrade.startsWith("D") && !letterGrade.startsWith("F")) {
        numberGrade -= 0.3;
    }
}

我的测试人员循环了一系列可能的等级

public static void main(String[] args) {
    String[] grades = {"A", "A-", "B+", "B", "B-", "C+", "C", "C-", "D+", "D", "F"};
    Course course = new Course("COP2253", " ");
    String toString;
    for (int i = 0; i < grades.length; i++) {
        course.updateGrade(grades[i]);
        toString = course.toString();
        System.out.println(toString + "\n");

    }

使用以下输出

COP2253     A   999.0
COP2253     A-  998.7
COP2253     B+  999.3
COP2253     B   999.0
COP2253     B-  998.7
COP2253     C+  999.3
COP2253     C   999.0
COP2253     C-  998.7
COP2253     D+  999.3
COP2253     D   999.0
COP2253     F   999.0

P.S。我很确定构造函数,

public Course(String courseID, String letterGrade) {
    this.courseID = courseID;
    this.letterGrade = letterGrade;
    computeGrade();
}

updateGrade()

public void updateGrade(String grade) {
    letterGrade = grade;
    computeGrade();
}

toString()

public String toString() {
    String grade = courseID + "\t\t" + letterGrade + "\t" + numberGrade;
    return grade;
}

不是问题。

3 个答案:

答案 0 :(得分:5)

您应该在每个案例之后添加break;。没有它,无论default中的内容是什么,您的程序都会抓取到switch

阅读docs以更好地了解 switch-case statmenets:

  

匹配案例标签后的所有语句按顺序执行,   无论后续案例标签的表达如何,直到休息   遇到陈述

答案 1 :(得分:3)

在每个case语句后不使用break;,switch将使用下一个案例直到默认值。因此,每次使用此switch语句时,它都会一直运行到default

答案 2 :(得分:2)

您目前拥有的是fall through案例 - 由于没有遇到break,您的代码将始终执行每个分支,最后的结果将是使用的。

必须break添加到此上下文中switch语句的末尾。