2017-08-09 52 views
1

我正在使用BlueJ IDE編寫Java程序。BlueJ中的編譯錯誤 - 如果返回語句爲

我有一個String返回類型的方法。我在if-else中放置了返回語句,如果布爾變量「flag」具有真值,則返回一個值,而如果值爲假,則返回另一個值。

現在,問題是,即使在此之後BlueJ要求另一個返回語句,如下所示。

enter image description here

如果我給的if-else,它的作品陸續返回。

這是怎麼發生的?我瞭解到,在退貨聲明後不會有任何陳述。那麼,編譯器爲什麼要求另一個return語句呢?

如果有人想要剪貼的目的代碼,在這裏。此代碼旨在將二進制數轉換爲其十進制等值,包括分數,但不包含負數。

public class Conversions{ 
    protected String Binary_Decimal(String str){ 
     int a = str.indexOf('.'); 
     boolean flag = false; 
     if (a == -1){ 
      str += ".0"; 
      a = str.indexOf('.'); 
      flag = true; 
     } 
     String bd = str.substring(0, a); 
     String ad = str.substring(a + 1); 
     a = 0; 
     double num = 0; 
     for (int i = bd.length() - 1; i >= 0; i--){ 
      num += Math.pow(2, a) * Integer.parseInt(Character.toString(str.charAt(i))); 
      a++; 
     } 
     if (flag == true){ 
      return Integer.toString((int) num); 
     } 
     else if (flag == true) { 
      a = -1; 
      for (int i = 0; i < ad.length(); i++){ 
       num += Math.pow(2, a) * Integer.parseInt(Character.toString(str.charAt(i))); 
       a--; 
      } 
      return String.valueOf(num); 
     } 
     return String.valueOf(num); //<-- WHY DOESN'T IT RUN WITHOUT THIS EXTRA return? 
    } 
} 

這裏,str是是通過使用不同的方法Input()所述用戶輸入的字符串。

+1

將文本插入代碼。不能引用,編譯等圖像 –

回答

2

問題是,你寫了if - else作爲if - else if。編譯器不理解或關心您擁有的兩個條件是相互排斥的,因此涵蓋了所有情況。鑑於您編寫分支的方式,您需要一個明確的else或catalll return,以確保編譯器確保該函數始終返回String

這是一個例子,說明當你有一組條件時,明確地說出else是一個壞主意。更重要的原因是您的if通常會包含更復雜的內容,您可能無法正確否定它。

+0

解決了這個問題。謝謝。 –

2

那麼,爲什麼編譯器要求另一個返回語句?

因爲缺少默認返回語句。

如果沒有滿足條件會怎麼樣?必須有東西返回默認的權利?這就是問題所在。這就是爲什麼當你取消註釋該行時它正在被編譯。

甚至,你有一個else語句,你的程序將至少有一個滿意的回報,它也被編譯。嘗試一下。

我已經瞭解到,return語句後面沒有語句。

此聲明附帶一些條件。你在if條件中有return語句。所以如果你的表達不是真的,返回得到執行是沒有辦法的。

2

刪除第二個ELSE IF子句並將該塊直接放在第一個return語句之後,並認爲該標誌是布爾值。如下:

if (flag) return Integer.toString((int) num); 
a=-1; 
for(....){ 
.... 
} 
return String.valueOf(num); 

這樣,編譯器不應該通知你那個錯誤。

+1

考慮到編譯器不知道你的if和then是否會處理所有可能的條件,並要求另一個包含所有其他情況的「else」。 – AndreaTaroni86

+0

另外,考慮如果第一個返回關閉了你的調用,那麼你的代碼中的其餘部分將不會被執行,所以ELSE沒有意義。特別是如果你正在測試布爾型標誌。再次測試標誌是沒有意義的,因爲如果標誌不正確,它必須是錯誤的。 – AndreaTaroni86