【问题标题】:Java - How to stop or continue DO WHILE loop if it cannot read the boolean valuesJava - 如果无法读取布尔值,如何停止或继续 DO WHILE 循环
【发布时间】:2017-09-11 21:15:22
【问题描述】:

我想要实现的是:用户应该输入一个日期字符串。然后,我将获取每个日期并对其进行验证并将其添加到 ArrayList。 如果日期与正则表达式不匹配,则应重新启动 do while 循环并再次要求输入。

我正在验证一个方法中的多个输入,并且对于所有这些输入,我使用一个布尔值“inputNotApproved”来判断 do while 是否应该结束。它适用于更简单的验证,例如名称,但因为我必须在 do while 循环内运行一个额外的 while 循环,程序无法读取布尔值“inputNotApproved”。

如果某些日期与正则表达式不匹配,我如何告诉 do while 循环重新启动。

do {
ArrayList<String> inputDatesList = new ArrayList<String>(); 
System.out.print("Available booking dates (DD-MM-YYYY DD-MM-YYYY ...): ");

       while(input.hasNext()){
            String date = input.next();

            if(date.matches("(0?[1-9]|[12][0-9]|3[01])-(0?[1-9]|1[012])-((20)(17|18))")){
                inputDatesList.add(date);
                inputNotApproved = false;
            }
            else{
                inputNotApproved = true;
                System.out.println("The date format is not correct (DD-MM-YYYY).");
            }
        }
}
while(inputNotApproved);

我在哪里使用它并且 inputNotApproved 按预期工作的示例:

do {
            System.out.print("Email address: ");
            String inputEmail = input.nextLine();

            if(inputEmail.matches("^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$")){
                inputNotApproved = false;
                newDentist.setEmail(inputEmail);
            }
            else {
                System.out.println("ERROR! The email is not in the correct format.");
                inputNotApproved = true;
                }
}

    while(inputNotApproved);

非常感谢任何帮助。如何让循环听“inputNotApproved”的真/假。谢谢你。

我还尝试了以下方法,它对将布尔值设为 false 做出反应,但 do-while 不会继续。

do {
            ArrayList<String> inputDatesList = new ArrayList<String>();
            System.out.print("Available booking dates (DD-MM-YYYY): ");
            inputNotApproved = true;

            while(input.hasNext() && input.hasNext("(0?[1-9]|[12][0-9]|3[01])-(0?[1-9]|1[012])-((20)(17|18))")){
                String date = input.next();
                inputDatesList.add(date);
                inputNotApproved = false;
            }


            if (!input.hasNext("(0?[1-9]|[12][0-9]|3[01])-(0?[1-9]|1[012])-((20)(17|18))")){
                System.out.println("The date format is not correct (DD-MM-YYYY).");
                continue;
            }
while(inputNotApproved);

最新更新。

我在内部 while 循环中添加了一个 break 和 !inputNotApproved。但是现在我注意到当日期输入正确并且匹配正则表达式时循环不会结束。它只是不断地接受输入。

我的代码现在看起来像这样:

do {
            ArrayList<String> inputDatesList = new ArrayList<String>(); // Temporary ArrayList, will be sent to ArrayList in Dentist class
            System.out.print("Available booking dates (DD-MM-YYYY): ");

        while(input.hasNext() && !inputNotApproved){
            String date = input.next();

            if(date.matches("(0?[1-9]|[12][0-9]|3[01])-(0?[1-9]|1[012])-((20)(17|18))")){
                inputDatesList.add(date);
                inputNotApproved = false;
            }
            else{
                inputNotApproved = true;
                System.out.println("The date format is not correct (DD-MM-YYYY).");
                break;
            }
        }
}
    while(inputNotApproved);

【问题讨论】:

  • “程序无法读取布尔值”是什么意思?你看到什么错误?这归结为变量的范围,如果在您的示例中它是在 do 之前声明的,那么您在这里应该可以工作。
  • 我没有收到错误,如果输入了错误的日期,do-while 循环不会重新开始,我希望系统再次请求输入(do-while 再次开始)。布尔值“inputNotApproved”在 do-while 循环之前声明。
  • 在代码的第二部分它可以工作。但是检查日期的第一部分似乎对循环期间设置的 inputNotApproved 没有反应。
  • 我对这样做的意图有点迷茫,但作为一个通用指针,如果您使用的是 IDE(如 Eclipse、IntelliJ或 NetBeans),了解如何设置断点,以便您可以逐行逐行执行代码并查看发生了什么。如果您不使用 IDE,则可以通过添加整个负载的临时 System.out.println 语句来查看哪些代码在何时执行,以及每个点的变量值是什么,从而获得几乎相同的效果。

标签: java boolean


【解决方案1】:

我认为这取决于您的确切要求 - 例如,如果日期无效,您希望用户重新输入所有日期,还是只输入无效的日期?

首先,我认为满足您的要求,您可以在内部 while 循环中添加一个附加条件,使其类似于:

while (input.hasNext() && !inputNotApproved)

这种逻辑感觉有点混乱,所以最好将内部 while 循环提取到一个单独的方法中,如果它们的格式都正确,则该方法可以返回日期列表,如果格式不正确,则抛出异常。在您的do...while 循环中,您只需捕获异常,并设置您的变量以触发它再次请求输入。

【讨论】:

  • 非常感谢您的反馈。我将 !inputNotApproved 添加到内部 while 循环中。但是现在我注意到,当日期正确时,do-while 似乎并没有结束。它只是继续接受输入
【解决方案2】:

如果我有更多的声誉,我会评论说您正在循环内初始化 ArrayList,这意味着它是一个局部变量。每次您的程序通过循环时,它都会重新创建您的 ArrayList,这意味着您的方法什么都不做!我建议在循环之外对其进行初始化,以便它真正有用。

另外,您只需在 while 循环中更改 inputNotApproved 的值。你确定你的程序总是进入它吗?如果没有,您应该在内部 while 循环之外将其设置为 true,就像您在工作示例中所做的那样。

您正在 while 循环中设置 inputNotApproved,但它只会在您的程序完成此 while 循环后重新启动外部 do 循环!您可以在 inputNotApproved=true 之后使用 break 语句退出 while 循环并重新启动 do 循环。另一种选择是在你的 while 循环中添加一个检查,如下所示:

while(input.hasNext() && !inputNotApproved)

我把这段代码放到我的调试器中,看起来还不错。我不认为您的程序在输入正确时不应该循环。但是,当您的程序看到错误输入时,它会继续循环,因为在您发布的版本中,您不要求输入。

import java.util.*;
public class test {
    public static void main(String[] args) {
      Scanner input = new Scanner("12-12-2017 11-04-2017 12-12-2017 11-04-2017 12-12-2017 11-04-2017");
      Boolean inputNotApproved = false;
      do {
            ArrayList<String> inputDatesList = new ArrayList<String>(); // Temporary ArrayList, will be sent to ArrayList in Dentist class
            System.out.print("Available booking dates (DD-MM-YYYY): ");

        while(input.hasNext() && !inputNotApproved){
             String date = input.next();

            if(date.matches("(0?[1-9]|[12][0-9]|3[01])-(0?[1-9]|1[012])-((20)(17|18))")){
                inputDatesList.add(date);
                inputNotApproved = false;
                System.out.println(date);
            }
            else{
                inputNotApproved = true;
                System.out.println("The date format is not correct (DD-MM-YYYY).");
                break;
            }
        }
      }
      while(inputNotApproved);
   }
}

【讨论】:

  • 嗨,Dan,ArrayList 仅用于验证目的。我没有在这个示例中包含它以使代码更简单,但在执行结束时,我将“临时”ArrayList 添加到另一个类中的永久 ArrayList 中。 :)
  • 好吧好吧。下次尽量不要添加初始化,因为那样我会假设你在你发布的代码之外初始化了数组列表。
【解决方案3】:

如果我正确理解您的问题,将您的 else 更改为包含一个 break 可能会解决它,退出内部循环并触发第二个 while 条件。

        else{
                inputNotApproved = true;
                System.out.println("The date format is not correct (DD-MM-YYYY).");
                break;
            }

编辑: 如果你想要更简单的话,你可以试试这样的方法。

        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        List<String> inputDatesList = new ArrayList<>();
        System.out.print("Available booking dates (DD-MM-YYYY): ");
        while(!in.lines().allMatch(input -> input.matches("(0?[1-9]|[12][0-9]|3[01])-(0?[1-9]|1[012])-((20)(17|18))"))){
            System.out.println("The date format is not correct (DD-MM-YYYY).");
            in = new BufferedReader(new InputStreamReader(System.in));
        }
        inputDatesList.addAll(in.lines().collect(toList()));

【讨论】:

  • 谢谢!休息做到了!...哇,太简单了,我已经挣扎了好几个小时。
  • A break 如果这只是一些小的一次性项目,那很好,但如果它可能会增长,请注意,如果你控制它很容易混淆并且很难看到发生了什么应用程序的流程是这样的。
  • 现在我注意到,当日期正确时,do-while 似乎并没有结束。它只是继续接受输入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 2012-10-18
相关资源
最近更新 更多