簡體   English   中英

為什么它給我一個返回丟失錯誤?

[英]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 示例可以正式證明語句不可到達,但規則說它仍然是可到達的,並要求編譯錯誤。

(因此在您的示例中,編譯器不需要推斷您的代碼不考慮零長度字符串。這是“人類水平”的推理。)

它在抱怨,因為您在循環結束時缺少返回。 您的方法可以在三種不同的情況下退出,即:

  1. 當字符串pass不為空且第一個字符不是數字時;
  2. 當字符串pass不為空且第一個字符為數字時;
  3. 當字符串為空時..

在代碼中:

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 使用當前代碼,我們涵蓋了所有退出點,即:

  1. 如果字符串僅包含數字,您將到達語句return.pass;isEmpty(); , 並因此return true ;
  2. 如果字符串至少包含一個非數字,則return false; ;
  3. 如果字符串為空,您將到達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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM