当输入有效时,Java do while循环仍会给出错误消息

当输入有效时,Java do while循环仍会给出错误消息,java,do-while,Java,Do While,当do while循环“Specify Max Time”得到有效输入时,它仍然会在中断循环之前给出错误消息 Scanner console = new Scanner(System.in); System.out.println("Specify city : "); String city; //loops if input is anything but New York or Paris do { city = console.next(); if (!city

当do while循环“Specify Max Time”得到有效输入时,它仍然会在中断循环之前给出错误消息

Scanner console = new Scanner(System.in);
System.out.println("Specify city : ");   
String city;

//loops if input is anything but New York or Paris
do { 
    city = console.next();
    if (!city.equals("New York") && !city.equals("Paris")) {
        System.out.println("Enter valid city");
    }
} while (!city.equals("New York") && !city.equals("Paris"));    
    System.out.println("Specify Max Time (HH:MM) : ");  
    String time;    

//loops if input not is in 24 hour format 
do { 
    time = console.next();  
    if (!time.matches("[0-9]{2}:[0-9]{2}")); {  
        System.out.println("Enter Valid Time (HH:MM) :");
    }                        
} while (!time.matches("[0-9]{2}:[0-9]{2}"));

你的时间正则表达式不好。一个问题是
“[0-9]”
应该是
“[0-9]{2}”
,另一个问题是您的代码很复杂-使用一个正则表达式测试整个表达式:

if (!time.matches("\\d\\d:\\d\\d"))

您还有另一个bug:


在第一个
while
子句中,您测试的是
巴黎
而不是
巴黎
您可以大大简化模式匹配:

do {
    // Your stuff goes here
} while(!time.matches("[0-9]{2}:[0-9]{2}"));
// --------------------^^^^^^^^^^^^^^^^^
// Easier, don't you think?
此外,还需要检查小时和分钟的值是否有效:小时的值应介于0和23之间,分钟的值应介于0和59之间


您已经有足够的时间来检查和验证代码。在这里,我提出了我自己的、经过测试的解决方案,以解决您的问题,因为我感到很慷慨,而且我现在没有更好的事情要做:

import java.util.Scanner;
公共类SO_示例_20151205_01{
公共静态void main(字符串[]args){
扫描仪控制台=新扫描仪(System.in);
String pattern=“[0-9]{2}:[0-9]{2}”;//用于验证时间是否有效的模式
字符串时间;//输入变量
布尔值valid_time=false;//中断循环的标志。初始化为false
整小时,分钟;
//在这种情况下,我更喜欢使用while循环。
//如果有效的_时间变量为true,则循环将中断
while(!有效时间){
系统输出打印(“输入时间(HH:MM):\t”);
time=console.next();
//检查输入是否与模式匹配:
if(时间匹配(模式)){
//现在,检查输入值是否有效
hour=Integer.parseInt(time.substring(0,2));
分钟=整数.parseInt(time.substring(3,5));
如果(小时>=0&&hour=0&&minute<60){
有效时间=真;
}否则{
System.out.println(“\n您输入了有效的模式,但值无效!\n请重试”);
}
}否则{
System.out.println(“\n您输入了无法识别的模式。请重试\n”);
}
}
System.out.println(“完成!”);
}
}
请注意,使用
while
循环可以避免多次编写内容。另外,检查我使用的模式。。。它起作用了

我经常使用布尔标志来打破我的循环(也许这不是更干净的解决方案,但它可以工作,它允许您准确地看到循环将要打破的位置和时间)。此外,我还为输入中的小时和分钟添加了验证


这个解决方案是故意冗长的。。。这正是我想要的:通过这种方式,您将更容易看到正在发生的事情。

您的程序中有许多错误。。。 1) 当您将城市作为输入时,将目的地输入更改为城市

if (!city.equals("New York") && !city.equals("Paris")) {
2) 在do while loop中,将其改为巴黎

} while (!city.equals("New York") && !city.equals("Paris"));
3) 将时间输入更改为时间,因为您将时间作为输入而不是时间输入(变量未在任何地方声明)

4) 将正则表达式更改为检查时间,因为正则表达式只检查一个数字,但它将是两个数字

time.substring(0, 2).matches("[0-9]{2}")
time.substring(3, 5).matches("[0-9]{2}")
更好的解决方案是使用单个正则表达式

if (!time.matches("\\d\\d:\\d\\d"))
5) 替换time.substring(4)。与time.charAt(2)=':'。time.substring(4)将返回开始索引4之后的所有字符


在您的while exit条件中也进行类似的更改

“虽然这里可能有类似的问题,但这一问题的解决方式不太可能对未来的读者有所帮助。”。它应该被关闭而不是被回答吗?@JanDvorak也许,但是这个问题变成了一个“错误的正则表达式”问题,可能是因为它使循环工作了,并且在输入有效时中断了循环,但是它仍然在移动前打印错误消息on@O.Potts检查您是否使用了正确的变量变量变量匹配,当输入在移动前有效时,它仍会显示错误消息on@O.Potts编辑您的问题并输入更新的代码。如果你仍然没有得到你所需要的,我不知道为什么我要用
city.equals()
替换
city.equalsIgnoreCase()
请不要编辑你的问题,因为这样会使你收到的答案无效。如果您需要提出新问题,请使用页面顶部的“提问”按钮。如果有助于提供上下文,您可以链接到此问题。
if (!time.matches("\\d\\d:\\d\\d"))