Java do while循环在输入有效时仍会显示错误消息

时间:2015-12-05 02:11:15

标签: java do-while

当为“指定最长时间”执行do while循环时,它给出了一个有效输入,它在断开循环之前仍会给出错误消息。

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

3 个答案:

答案 0 :(得分:3)

你的正则表达时间不好。一个问题是let curDate = NSDate() let calendar = NSCalendar.currentCalendar() let comps: NSDateComponents = calendar.components([NSCalendarUnit.Month, NSCalendarUnit.Day, NSCalendarUnit.Year], fromDate: curDate) comps.day = 1 //first moment of the month let firstDateMonth = calendar.dateFromComponents(comps) comps.month = comps.month+1 //first moment of next month let lastDateMonth = calendar.dateFromComponents(comps) let totalInterval = lastDateMonth?.timeIntervalSinceDate(firstDateMonth!) let intervalToEnd = lastDateMonth?.timeIntervalSinceNow let percentLeft = intervalToEnd!/totalInterval! print(percentLeft) 应该是"[0-9]",另一个是你的代码是复杂的 - 使用一个正则表达式测试整个表达式:

"[0-9]{2}"

您还有另一个错误:

在第一个if (!time.matches("\\d\\d:\\d\\d")) 子句中,您正在测试while而不是"paris"

答案 1 :(得分:0)

您可以大大简化模式匹配:

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;

public class SO_Example_20151205_01 {
    public static void main(String[] args) {
        Scanner console = new Scanner(System.in);
        String pattern = "[0-9]{2}:[0-9]{2}";   // The pattern you'll use to validate if the time is valid
        String time;                            // The input variable
        boolean valid_time = false;             // A flag to break the loop. Initialized to false
        int hour, minute;

        // I prefer to use a 'while' loop in this case.
        // The loop will break if the valid_time variable is true
        while(!valid_time) {
            System.out.print("Enter time (HH:MM):\t");
            time = console.next();
            // Check if the input matches the pattern:
            if(time.matches(pattern)) {
                // Now, check if the input values are valid
                hour = Integer.parseInt(time.substring(0,2));
                minute = Integer.parseInt(time.substring(3,5));
                if(hour >= 0 && hour <= 24 && minute >= 0 && minute < 60) {
                    valid_time = true;
                } else {
                    System.out.println("\nYou've entered a valid pattern, but the values are invalid!\n Please try again");
                }
            } else {
                System.out.println("\nYou entered a non recognized pattern. Please try again\n");
            }
        }
        System.out.println("Done!");
    }
}

请注意,使用while循环,您可以避免多次编写内容。另外,检查我使用的模式......它有效!

我经常使用布尔标志来破坏我的循环(也许它不是更清洁的解决方案,但它可以工作,它可以让你准确地看到循环即将中断的位置和时间)。此外,我还在输入中添加了小时和分钟的验证。

这个解决方案故意冗长......这正是我想要的:这样,你就可以更容易地看到发生了什么。

答案 2 :(得分:0)

你的程序中有很多错误...... 1)当您将城市作为输入时,将destination_input更改为城市。

if (!city.equals("New York") && !city.equals("Paris")) {

2)在do while循环中将其更改为Paris

} while (!city.equals("New York") && !city.equals("Paris"));

3)将time_input更改为time,因为您输入的时间不是time_input(变量未在任何地方声明)

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).matches替换为time.charAt(2)==':'。time.substring(4)将返回开始索引4之后的所有字符。

同时退出条件也进行类似的更改