2013-12-08 56 views
-2

我正在创建一个类Course,它表示具有三个属性courseIDletterGradenumberGrade的课程对象。这个switch语句为什么不能识别subString?

numberGrade使用computeGrade()方法从letterGrade计算。我目前正在测试我的Course课程,并发现computeGrade中使用的开关语句不能识别相关的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; 
} 

不是问题。

+2

您忘记在交换机中的每个案例之后添加'break;'语句。因此,无论'letterGrade.substring'返回什么,您都会转到默认情况。 –

回答

5

您应该在每个的情况下后加break;。没有它,你的程序会爬到default,不管switch中有什么。

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

匹配的case标签后,所有语句顺序执行, 无论后续case标签的表达,,直到休息 声明遇到

+0

这不完全正确;虽然传统上'switch'会执行直到发现中断,你可以在任何分支中抛出异常,并且会停止执行'switch'。 – Makoto

+0

@Makoto你是对的。在他的情况下,这不会发生。 – Maroun

+0

是的,这是真的。在这种情况下,这根本不会发生。 – Makoto

3

在每个case-statement之后没有使用break;,交换机将使用下一个案例直到默认值。所以每次使用该开关语句将运行,直到default

2

什么,你现在已经是一个fall through情况 - 因为没有break遇到过,你的代码将一直执行每一个分支,最后的结果将是干什么用的。

必须添加break到您的switch陈述在这方面的结束。

相关问题