Java 为什么它会给我一个返回丢失的错误?

Java 为什么它会给我一个返回丢失的错误?,java,unreachable-statement,Java,Unreachable Statement,为什么这个方法总是告诉我它缺少返回语句?如果我删除了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("Mus

为什么这个方法总是告诉我它缺少返回语句?如果我删除了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;
        }
        
    }
公共静态布尔数字(字符串传递){
对于(int i=0;i
为什么这个方法总是告诉我它缺少返回语句

因为有一种方法可以到达
for
循环之后的点。考虑< <代码>传递>代码>长度为零的情况。

更一般地说,用于确定语句(或代码中的点)的可访问性的规则如中所述。简单的
for
循环的相关规则如下:

当且仅当以下至少一项为真时,
for的基本
语句才能正常完成:

  • for
    语句是可访问的,有一个条件表达式,条件表达式不是值为true的常量表达式(§15.29)
  • 有一个可到达的break语句退出
    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
        }
    
    它编译得很好,即使循环结束时没有返回语句。为什么?因为基于上述规则,我的循环无法正常完成,因为它的条件表达式是
    true
    ,所以可以找到关于它的更多详细信息。公平地说,在我的IDE中,当我添加了您的代码后,我立即得到警告,
    'for'语句没有循环

    总之,对于您的案例,您需要涵盖这三个场景,并且在循环的末尾有一个return语句,您可以阅读更多关于或使用@Stephen C answer的内容,它可以很好地将其分解

    除此之外,你的方法不是做你想做的事。您只比较字符串的第一个数字,但应检查整个字符串,如:

     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();
        }
    

    谢谢你打字!我只是忘了把线圈的brackets@MohSameh嗨,你介意接受一个答案吗:)?
      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;
            }
        }
    
     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();
        }
    
    public static boolean isDigit(String pass){
        return !pass.isEmpty() && pass.chars().allMatch(Character::isDigit);
    }