2015-06-16 125 views
-1

我遇到了布爾方法的麻煩。使用if語句的Java布爾方法 - 「必須返回布爾類型的結果」

private boolean askYesNoQuestion(String prompt){ 
prompt = prompt.toLowerCase(); 
if(prompt.equals("yes")) return true; 
if(prompt.equals("no")) return false; 
else prompt = readLine("Please answer yes or no."); 
} 

Eclipse中說: 「方法必須返回boolean類型的結果」。下面的代碼

同樣的問題:

private boolean isPerfectSquare(int n){ 
for(int i = 0; i <= n; i++){ 
if(i*i == n) { 
return true; 
} 
else return false; 
} 

我想我已經包含在了報表return,但他們是一個if語句之後。

+2

請格式化代碼位。 – DJClayworth

回答

5

儘管您確實包含一對return語句,但它們都發生在循環中。 Java檢查所有路徑,發現循環可以在不進入第一次迭代的情況下完成 - 例如,因爲n是負數。在這種情況下,if聲明不會執行,因此不會有return

您可以在循環後包含無條件返回來解決此問題。然而,它看起來像是你的邏輯被破壞了:如果你完全進入循環,你會馬上返回,而不會完成第一次迭代。它看起來像你的意思是這樣寫:

private boolean isPerfectSquare(int n){ 
    for(int i = 0; i <= n; i++){ 
     if(i*i == n) { 
      return true; 
     } 
    } 
    return false; 
} 
0

您需要在方法本身的範圍有返回值(true或false)爲您的return語句目前沒有if語句「看得見」的外側。

實際上可以省略第二種方法中的else語句。對於第一個,只需在最後一個外面返回false。

0

每個執行路徑必須返回一個布爾值。在你的第一個例子中else prompt = readLine("Please answer yes or no.");不返回布爾值

0

你需要在for循環之後返回一個布爾值。如果我們假設n = -1,那麼'if'語句不會被執行。

0

首先,嘗試格式化您的代碼,以便更容易遵循邏輯。在第一個代碼中,出現錯誤的原因是因爲該方法可能不會返回任何內容。如果提示符不是「是」且不是「否」,它將轉到else語句。程序將運行readLine,並退出該方法而不返回任何內容。你想要做的是在一個while循環中運行readline,直到輸入yes或no纔會終止。

對於第二個問題,您有一個邏輯問題。如果n不是0,你的方法將總是返回false。你應該把return false行放在for循環之外。

0

在你的第一個塊else語句中,你還沒有返回任何東西。 此更改將會使其正常。

private boolean askYesNoQuestion(String prompt){ 
    prompt = prompt.toLowerCase(); 
    if(prompt.equals("yes")) 
      return true; 
    if(prompt.equals("no")) 
      return false; 
    else { 
      prompt = readLine("Please answer yes or no."); 
      return [true or false] 
     } 
} 

在你的第二個塊中,如果n是一個負值,所以for語句不會運行,所以在那裏沒有return語句。 所以它可以這樣。

private boolean isPerfectSquare(int n){ 
    for(int i = 0; i <= n; i++){ 
     if(i*i == n) { 
      return true; 
     } 
     else 
      return false; 
    } 
    return [true or false] 
} 
0

如果聲明某個方法返回某些內容,則所有代碼路徑都必須返回一個值。你有兩個返回值的代碼路徑,而另一個沒有。格式化你的代碼,它變得更清晰的問題是什麼:

private boolean askYesNoQuestion(String prompt) { 
    prompt = prompt.toLowerCase(); 
    if (prompt.equals("yes")) { 
     return true; 
    } 

    if (prompt.equals("no")) { 
     return false; 
    } else { 
     prompt = readLine("Please answer yes or no."); 
    } 

    // You must return a boolean value here 
} 

你最終else說法是多餘的 - 如果不prompt等於no沒有進一步的代碼會被執行。您可以刪除它並在適當的地方添加另一個return false

private boolean askYesNoQuestion(String prompt) { 
    prompt = prompt.toLowerCase(); 
    if (prompt.equals("yes")) { 
     return true; 
    } 

    if (prompt.equals("no")) { 
     return false; 
    } 

    writeLine("Please answer yes or no."); 
    return false; 
} 

這可以進一步簡化。作爲消除錯誤的第一步,代碼格式化可能非常重要。重新格式化你的第二個例子,看看你能否弄清楚什麼是必需的,什麼不是。

0

感謝大家。看起來,「return」語句必須在任何循環之外(例如for,while)。下面的代碼產生了很好的結果。

public class Test1 extends ConsoleProgram { 

public void run() { 
    String prompt = readLine("Would you like instructions?"); 
    prompt = prompt.toLowerCase(); 
    while(!prompt.equals("yes") && !prompt.equals("no")){ 
     prompt = readLine("Please answer yes or no."); 
     prompt = prompt.toLowerCase(); 
    } 
    if(askYesNoQuestion(prompt)) println("Here are the instructions."); 
    else println("Please start the test."); 
    println(askYesNoQuestion(prompt)); 

} 
private boolean askYesNoQuestion(String prompt){   
    if(prompt.equals("yes")) { 
     return true; 
    } 
    else return false;    
} 

}

第二個程序也工作,如果 「返回」 語句是外循環:

private boolean isPerfectSquare(int n){ 
     int i = 0; 
     while (i*i != n) { 
       if (i*i > n) break; 
       i ++; 
     } 
     return (i*i == n); 
    }