2012-10-06 99 views
1

我不明白爲什麼它總是返回arg1的值。我正在構建一個權重轉換器。在Java中使用開關的問題

public double convert(double arg1,int arg2,int arg3) { 
    // arg1 = amount, arg2 = from, arg3 = to 
    double milligram = 1; 
    double gram = 1000; 
    double ounce = 28349.5; 
    double pound = 453592; 
    double answer = 0; 
    switch(arg2) { 
    case 0: switch(arg3) { // if milligram 
      case 0: answer = (arg1 * milligram)/milligram; 
      case 1: answer = (arg1 * milligram)/gram; 
      case 2: answer = (arg1 * milligram)/ounce; 
      case 3: answer = (arg1 * milligram)/pound; 
    } 
    case 1: switch(arg3) { // if gram 
      case 0: answer = (arg1 * gram)/milligram; 
      case 1: answer = (arg1 * gram)/gram; 
      case 2: answer = (arg1 * gram)/ounce; 
      case 3: answer = (arg1 * gram)/pound; 
    } 
    case 2: switch(arg3) { // if ounce 
      case 0: answer = (arg1 * ounce)/milligram; 
      case 1: answer = (arg1 * ounce)/gram; 
      case 2: answer = (arg1 * ounce)/ounce; 
      case 3: answer = (arg1 * ounce)/pound; 
    } 
    case 3: switch(arg3) { // if pound 
      case 0: answer = (arg1 * pound)/milligram; 
      case 1: answer = (arg1 * pound)/gram; 
      case 2: answer = (arg1 * pound)/ounce; 
      case 3: answer = (arg1 * pound)/pound; 
    } 
    } // end arg2 switch 
    return answer; 
} 

我搞砸了我的邏輯,但我無法看到在哪裏。 任何幫助,將不勝感激。

+1

你爲什麼不直接給出你的論點的數量,從和到? –

+0

在這種情況下,最好使用數組並完全刪除交換機。像'answer =(arg1 * conv [arg2])/ conv [arg3];' – irrelephant

+0

@irrelephant我喜歡使用switch語句,因爲它們對於我來說更容易理解。我很久沒有使用它們,所以我完全忘記了必須打破每個案例。 –

回答

9

你缺少break聲明:

case 0: 
    answer = (arg1 * milligram)/milligram; 
    break; 
    ... 
+0

謝謝,它的工作。 –

0

嵌套case語句是相當困難的閱讀,很難調試。相反,將所需的功能封裝到方法調用中會更好。

這就是說,在交換機的任何地方都沒有break聲明。不管情況如何,它將落在最後一個案例中(設置與案例底部相同的答案)。

2

改寫這樣

case 2: switch(arg3) { // if ounce 
     case 0: answer = (arg1 * ounce)/milligram;break; 
     case 1: answer = (arg1 * ounce)/gram;break; 
     case 2: answer = (arg1 * ounce)/ounce;break; 
     case 3: answer = (arg1 * ounce)/pound;break; 
0

任何情況下你應該在switch語句中使用break,否則你的結果可能使用return語句被detoriated

0

除了使用break,是卓有成效的,以及它也可以防止通過案件。

case 2: switch(arg3) { // if ounce 
    case 0: return (arg1 * milligram)/milligram;