【问题标题】:If if statement inside method returns false, loop until it returns true如果方法内的 if 语句返回 false,则循环直到它返回 true
【发布时间】:2021-09-10 04:01:27
【问题描述】:

我似乎无法弄清楚。

如果用户键入的内容不等于 12 个字符,我希望它这样做,否则它会循环直到用户键入的内容与返回 true 的 if 语句的要求相匹配。

二传手:

//boolean returning method for validation
public boolean setSSN(String ssN) {
    
    if (ssN.length() != 12) {

        return false;
    }
    if(Character.isDigit(ssN.charAt(0)) && Character.isDigit(ssN.charAt(1)) &&
       Character.isDigit(ssN.charAt(2)) && ssN.charAt(3) == '-' &&
       Character.isDigit(ssN.charAt(4)) && Character.isDigit(ssN.charAt(5)) &&
       Character.isDigit(ssN.charAt(6)) && ssN.charAt(7) == '-' &&
       Character.isDigit(ssN.charAt(8)) && Character.isDigit(ssN.charAt(9)) &&
       Character.isDigit(ssN.charAt(10)) && Character.isDigit(ssN.charAt(11))) {
        
        ssNumber = ssN;
        return true;
    }
    else {
        System.out.println("Error message") ;
        return false;
    }
    }

主要:

    System.out.println("What is your social security number using this format XXX-XXX-XXXX: "); 
    
    do {
    System.out.print("SSN: ");
    String input1 = in.nextLine();
        employee1.setSSN(input1);
        System.out.println();
        System.out.println(employee1.toString());
        
        System.out.println();
    } while(!employee1.setSSN(true)); 

如果有什么遗漏,请告诉我。我在编程 1 之后才开始编程 2 两个学期,我对一切都有些生疏了。

【问题讨论】:

    标签: java loops if-statement setter mutators


    【解决方案1】:
    1. 验证逻辑应该从setSSN setter 中移出,因为验证一个值并将这个值设置到一个实例字段是两个职责。

    因此,setter 应该看起来很简单:

    // Employee class
    public void setSSN(String ssn) {
        this.ssNumber = ssn;
    }
    
    1. Regular expressions 应该用于验证字符串模式,在这种情况下可以应用方法String::matches 而不是多重检查Character.isDigit

    ###-###-#### 格式验证 SSN 的方法,其中# 表示一个数字可能如下所示:

    public static boolean isSSNValid(String ssn) {
        return ssn.matches("\\d{3}-\\d{3}-\\d{4}");
    }
    

    如果需要通过额外的验证(例如检查 SSN 控制总和)或 SSN 格式发生变化,可以修改此 single 方法。

    1. 有效值的读取可以封装在另一个接受扫描仪/读取器并返回有效字符串的函数中:
    public static String readValidSSN(Scanner in) {
        System.out.println("What is your social security number using this format XXX-XXX-XXXX?");
        String inputSSN;
        System.out.print("SSN: ");
        while (!isSSNValid(inputSSN = in.nextLine())) {
            System.out.println("Input SSN has invalid format, please try again");
            System.out.print("SSN: ");
        }
        return inputSSN;
    }
    

    那么 main 方法会被简化成这样:

    // ...
    employee.setSSN(readValidSSN(in));
    System.out.println();
    System.out.println(employee); // method toString is invoked automatically
    System.out.println();
    

    【讨论】:

      【解决方案2】:

      你不应该调用你的方法两次。使用无限循环,成功后您将跳出。

      while(true) {
          System.out.println("What is your social security number using this format XXX-XXX-XXXX: "); 
          System.out.print("SSN: ");
          String input1 = in.nextLine();
          if (employee1.setSSN(input1))   // returns true if valid
          {
              System.out.println();
              System.out.println(employee1.toString());
              break;
          }
          
          System.out.println();
      } 
      

      【讨论】:

        猜你喜欢
        • 2020-08-08
        • 2019-10-03
        • 2012-07-07
        • 2017-08-10
        • 2018-12-03
        • 2016-11-29
        • 2016-02-12
        • 2018-10-22
        • 1970-01-01
        相关资源
        最近更新 更多