Java-如果无法读取布尔值,如何停止或继续DO WHILE循环

Java-如果无法读取布尔值,如何停止或继续DO WHILE循环,java,boolean,Java,Boolean,我试图实现的是:用户应该输入一系列日期。然后,我将对每个日期进行验证,并将其添加到ArrayList中。 如果日期与正则表达式不匹配,则应重新启动do while循环并再次请求输入 我正在验证一个方法中的几个输入,并使用布尔值“inputNotApproved”来判断do while是否应该结束。它在更简单的验证中工作得很好,例如name,但是由于我必须在do-while循环中运行额外的while循环,程序无法读取布尔值“inputNotApproved” 在某些日期与正则表达式不匹配的情况下,

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

我正在验证一个方法中的几个输入,并使用布尔值“inputNotApproved”来判断do while是否应该结束。它在更简单的验证中工作得很好,例如name,但是由于我必须在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”的真/假。多谢各位

我还尝试了下面的方法,将布尔值设为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);
do{
ArrayList inputDatesList=新的ArrayList();
系统输出打印(“可用预订日期(DD-MM-YYYY):”;
inputNotApproved=真;
而(input.hasNext()&&input.hasNext(((0?[1-9]|[12][0-9]|[3[01])-(0?[1-9]|[012])-((20)(17 | 18))){
字符串日期=input.next();
inputDatesList.add(日期);
inputNotApproved=假;
}
如果(!input.hasNext(((0?[1-9]|[12][0-9]|[3[01])-(0?[1-9]|[012])-((20)(17 | 18))){
System.out.println(“日期格式不正确(DD-MM-YYYY)”;
继续;
}
while(输入未经批准);

最新更新

我在内部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{
ArrayList inputDatesList=new ArrayList();//临时ArrayList将被发送到类中的ArrayList
系统输出打印(“可用预订日期(DD-MM-YYYY):”;
while(input.hasNext()&&!inputNotApproved){
字符串日期=input.next();
如果(日期匹配(((0?[1-9]|[12][0-9]|[3[01])-(0?[1-9]|[012])-((20)(17 | 18))){
inputDatesList.add(日期);
inputNotApproved=假;
}
否则{
inputNotApproved=真;
System.out.println(“日期格式不正确(DD-MM-YYYY)”;
打破
}
}
}
while(输入未经批准);

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

作为一个初学者,我认为这符合您的要求,您可以在内部while循环中添加一个附加条件,使其类似于:

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

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

如果我正确理解了您的问题,则更改else以包含中断可能会修复它,从而退出内部循环,并触发第二个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()));
BufferedReader-in=新的BufferedReader(新的InputStreamReader(System.in));
List inputDatesList=新的ArrayList();
系统输出打印(“可用预订日期(DD-MM-YYYY):”;
而(!in.lines().allMatch(输入->输入.matches((0?[1-9]|[12][0-9]|[3[01])-(0?[1-9]|[012])-((20)(17 | 18))){
System.out.println(“日期格式不正确(DD-MM-YYYY)”;
in=新的BufferedReader(新的InputStreamReader(System.in));
}
inputDatesList.addAll(in.lines().collect(toList());

如果我有更多的声誉,我会评论说你正在循环内部初始化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);
   }
}
import java.util.*;
公开课考试{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(“12-12-2017 11-04-2017 12-12-2017 11-04-2017 12-12-2017 11-04-2017”);
Boolean inputNotApproved=假;
做{
ArrayList inputDatesList=new ArrayList();//临时ArrayList将被发送到类中的ArrayList
系统输出打印(“可用预订日期(DD-MM-YYYY):”;
while(input.hasNext()&&!inputNotApproved){
字符串日期=input.next();
如果(日期)匹配(“(0?
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);
   }
}