[英]Why is it giving me a return missing error?
為什么這個方法一直告訴我它缺少返回語句? 如果我刪除 else 它告訴我返回 true 是不可達的。 在此先感謝您的幫助 !
public static boolean Digit(String pass){
for (int i=0; i < pass.length(); i++ ){
if (!Character.isDigit(pass.charAt(i))) {
System.out.println("Must contain digits");
return false;
}
else
return true;
}
}
為什么這個方法一直告訴我它缺少返回語句?
因為有一種方法可以在for
循環之后到達該點。 考慮pass
長度為零的情況。
更一般地,用於確定語句(或代碼中的點)的可達性的規則在JLS 14.22中列出。 簡單for
循環的相關規則如下:
當且僅當以下至少一項為真時,基本
for
語句才能正常完成:
for
語句可達,有條件表達式,且條件表達式不是值為 true 的常量表達式(第 15.29 節)。- 有一個可到達的 break 語句退出
for
語句。
在您的示例中,第一個要求得到滿足。 因此, for
循環可以正常完成。 因此在for
循環之后有一個返回點。 因此,此時需要return
語句。
請注意,可達性規則不依賴於 Java 編譯器是否足夠聰明地分析應用程序的邏輯,並且它們不會讓編譯器自行決定是否聰明。 因此,有 Java 示例可以正式證明語句不可到達,但規則說它仍然是可到達的,並要求編譯錯誤。
(因此在您的示例中,編譯器不需要推斷您的代碼不考慮零長度字符串。這是“人類水平”的推理。)
它在抱怨,因為您在循環結束時缺少返回。 您的方法可以在三種不同的情況下退出,即:
pass
不為空且第一個字符不是數字時;pass
不為空且第一個字符為數字時;在代碼中:
public static boolean Digit(String pass){
for (int i=0; i < pass.length(); i++ ){
if (!Character.isDigit(pass.charAt(i))) {
System.out.println("Must contain digits");
return false; // <--- can exit here
}
else
return true; // <-- can exit here
}
// <-- can exit here if the string pass is empty
}
您涵蓋了前兩種情況,但沒有涵蓋第三種情況(即,當字符串為空時)。
現在,由於 Java 規則“ 用於確定語句的可達性” ,正如@Stephen C 首先指出的那樣(並且已經很好地解釋了,並且是改進我的答案的靈感來源)邏輯上僅涵蓋三個場景將不要讓你的代碼編譯干凈。 例如:
public static boolean Digit(String pass){
if(pass.isEmpty())
return false;
for (int i=0; i < pass.length(); i++ ){
if (!Character.isDigit(pass.charAt(i))) {
System.out.println("Must contain digits");
return false;
}
else
return true;
}
}
在上面的代碼中,所有可能的退出點都被覆蓋了,但是,我的 IDE 仍然抱怨缺少返回語句。 為什么? 因為根據上述規則,這個循環可以正常完成,因此需要在 if 結束時return
。 但是,使用相同的語義相同的代碼:
public static boolean Digit(String pass){
if(pass.isEmpty())
return false;
for (int i = 0; true; i++ ){
if (!Character.isDigit(pass.charAt(i))) {
System.out.println("Must contain digits");
return false;
}
else
return true;
}
}
它編譯得很好,即使在循環結束時沒有返回語句。 為什么? 因為基於上述規則,我的循環不能再正常完成,因為它的條件表達式是true
,關於它的更詳細的信息可以在這里找到。 公平地說,我的 IDE,只要我添加了你的代碼,我就立即收到警告, 'for' statement does not loop
。
總之,對於您的情況,您需要涵蓋這三種情況,並在循環結束時有一個 return 語句,您可以在此處或使用@Stephen C 答案閱讀更多信息,該答案很好地分解了它。
除此之外,你的方法並沒有做你想做的事。 您只比較字符串的第一個數字,但您應該檢查整個字符串,例如:
public static boolean Digit(String pass){
for (int i=0; i < pass.length(); i++ ){
if (!Character.isDigit(pass.charAt(i))) {
System.out.println("Must contain digits");
return false;
}
}
return !pass.isEmpty();
}
您只想在找到不是數字的字符或(在循環結束時)檢查整個字符串后return
。 我要返回.pass;isEmpty();
以確保如果字符串為空,我們不會return true
。 使用當前代碼,我們涵蓋了所有退出點,即:
return.pass;isEmpty();
, 並因此return true
;return false;
;return.pass;isEmpty();
,因此return false
。 附帶說明,您應該將方法的名稱從Digit
更改為isAllDigits
,后者比前者更明確。
另一個注意事項,使用 Java 流,您可以將方法簡化為:
public static boolean isDigit(String pass){
return !pass.isEmpty() && pass.chars().allMatch(Character::isDigit);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.