2013-12-08 39 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陳述在這方面的結束。

相關問題