2012-11-19 128 views
0

我有一段代碼根據所需的輸入和輸出來改變參數的值。因此,在下面的示例中,我計算球體的體積,然後根據用戶用於輸入的單位以及用戶爲輸出選擇的單位相應地操縱數字。兩個看似相等的字符串不等於

我的問題是,我所有的if語句都返回false,並且無論選擇什麼,數字10(來自else)都會通過。我已經輸出了inputPref和outputPref的值,它們看起來完全等於「mm」和「cubic cm」(例如),但仍然不會被if語句捕獲。

任何明顯的錯誤?如果有幫助,兩個變量「inputPref」和「outputPref」將從共享首選項中加載!

double volumeBase = 4 * piDouble * radius * radius * radius/3; 

       double volume; 
       if(inputPref.equals("mm") || outputPref.equals("cubic cm")) 
       { 
        volume = volumeBase/1000; 
       } 
       if(inputPref.equals("mm") || outputPref.equals("cubic metres")) 
       { 
        volume = volumeBase/1000000000; 
       } 
       if(inputPref.equals("cm") || outputPref.equals("cubic mm")) 
       { 
        volume = volumeBase * 1000; 
       } 
       if(inputPref.equals("cm") || outputPref.equals("cubic metres")) 
       { 
        volume = volumeBase/1000000; 
       } 
       if(inputPref.equals("metres") || outputPref.equals("cubic mm")) 
       { 
        volume = volumeBase * 1000000000; 
       } 
       if(inputPref.equals("metres") || outputPref.equals("cubic cm")) 
       { 
        volume = volumeBase * 1000000; 
       } 
       else 
       { 
        volume = 10; 
       } 
+0

try inputPref.trim()。equals() –

+0

你是否修剪了('String.trim()')字符串? – SJuan76

+0

另外,我有一種感覺,你的''''應該是'&&'和。 – SJuan76

回答

6

你所有的if語句(除了第一個)應該是else if報表,使其只選擇1出所有的選項。

就目前而言,您的代碼可能會在早期評估if聲明,但它最後會覆蓋最後一個if-else,這幾乎總是會返回10

正如評論指出的那樣,你可能也意味着使用的&&代替||,使你正在運行的代碼時條件匹配每個ifelse if聲明。您也可以考慮使用equalsIgnoreCase()而不是equals(),以便用戶輸入的情況無關緊要。

它應該是...

double volumeBase = 4 * piDouble * radius * radius * radius/3; 

double volume; 
if(inputPref.equalsIgnoreCase("mm") && outputPref.equalsIgnoreCase("cubic cm")){ 
    volume = volumeBase/1000; 
} 
else if(inputPref.equalsIgnoreCase("mm") && outputPref.equalsIgnoreCase("cubic metres")){ 
    volume = volumeBase/1000000000; 
} 
else if(inputPref.equalsIgnoreCase("cm") && outputPref.equalsIgnoreCase("cubic mm")){ 
    volume = volumeBase * 1000; 
} 
else if(inputPref.equalsIgnoreCase("cm") && outputPref.equalsIgnoreCase("cubic metres")){ 
    volume = volumeBase/1000000; 
} 
else if(inputPref.equalsIgnoreCase("metres") && outputPref.equalsIgnoreCase("cubic mm")){ 
    volume = volumeBase * 1000000000; 
} 
else if(inputPref.equalsIgnoreCase("metres") && outputPref.equalsIgnoreCase("cubic cm")){ 
    volume = volumeBase * 1000000; 
} 
else { 
    volume = 10; 
} 

如果仍不能正常工作,它可能與你在哪裏讀取用戶輸入的代碼中的問題。

+0

謝謝@ SJuan76很好的注意 - 我認爲你可能是正確的基於他的要求。答案更新如此。 – wattostudios

6

else末將音量設置爲10如果inputPref不是metrescubic cm,因爲只有你最後if涉及到else。如果您在之前的if之前加上else,則它可能會按照您的預期工作。您也有一些重複項目(您正在檢查mm多次)。

E.g. (但也請看下面):

double volume; 
if(inputPref.equals("mm") || outputPref.equals("cubic cm")) 
{ 
    volume = volumeBase/1000; 
} 
// v--- Note the `else` 
else if(inputPref.equals("mm") || outputPref.equals("cubic metres")) 
{ 
    volume = volumeBase/1000000000; 
} 
// ... 

而且,noted by Lews Therin,我懷疑你想&&每對那些,例如:

// here -------------------vv 
if (inputPref.equals("mm") && outputPref.equals("cubic cm")) 

if (inputPref.equals("mm") || outputPref.equals("cubic cm")) 
+2

請注意,該字符串開關僅適用於Java7! – ppeterka

+0

@ppeterka:無論如何這個用例無效(只是刪除它),我錯過了有兩個不同的變量被檢查。 :) –

5

我想你想使用else if的和你的條件下使用& &不||

+1

姆姆..不知道爲什麼我得到downvoted。如果條件使用&&而不是||,我認爲是有意義的 –

+0

非常好的接觸'&&'與'||'。 –

1

可能是你最後一次如果失敗,從而被分配在其他注:否則將只適用於在最後如果。 使用別的,如果不是所有的,如果的

if(cond){ 

} 
else if(cond){ 

} 
else{ 

} 
1

我會扔掉字符串,並用枚舉了這種代碼...

public enum LengthUnit { 
    M, 
    CM, 
    MM 
} 

public enum VolumeUnit { 
    M3, 
    CM3, 
    MM3 
} 

你甚至可以把在轉換率類似的單位之間存在,就像在TimeUnit

優點:

  • 沒有霧YPES,沒有神祕
  • 更快

缺點:

  • 需要一些努力來維持,如果它需要擴大。