无法获得正确的字符串输入

时间:2011-09-22 19:18:13

标签: java while-loop

我正在用Java编写一个方法,用户应该输入汽车的牌照。第一个标志必须是大写字母,第三个标志必须是1到9之间的数字,最后4个数字必须是0到9之间的数字。如果用户没有正确输入,则应出现错误信息,并且将要求用户再次输入牌照。

在测试问题之后,我发现如果我故意不断地犯了很多不同的错误,然后最后正确进入车牌,程序仍然会告诉我输入错误。我很难知道如何构建它,因为它应该考虑到这么多可能的错误。我的代码目前对于相关方法看起来像这样:

    char sign;
System.out.print("License plate: ");
    licensePlate = input.next();

    for (int index = 0; index < 2; indeks++) {
        sign = licensePlate.charAt(indeks);
        while (sign < 'A' || sign > 'Z') {
            System.out.println(licensePlate + " is not a valid license plate (two big letters + five digits where the first digit can not be 0)");
            System.out.print("License plate: ");
            licensePlate = input.next(); }
    }

    while (licensePlate.charAt(2) < '1' || licensePlate.charAt(2) > '9') {
        System.out.println(licensePlate + " is not a valid license plate (two big letters + five digits where the first digit can not be 0)");
    System.out.print("License plate: ");
    licensePlate = input.next(); }

    for (int counter = 3; counter < 7; counter++) {
        sign = licensePlate.charAt(teller);
        while (sign < '0' || sign > '9') {
            System.out.println(licensePlate + " is not a valid license plate (two big letters + five digits where the first digit can not be 0)");
    System.out.print("License plate: ");
    licensePlate = input.next(); }  
    }

    carObject.setLicensePlate(licensePlate); 

如果有人能帮我写这篇文章,我将非常感激!

3 个答案:

答案 0 :(得分:2)

问题在于你经常接受新输入,但再次开始。值得一个单独的方法来执行测试,如下所示:

boolean gotPlate = false;    
String plate = null;

while (!gotPlate) {
    System.out.print("License plate: ");
    plate = input.next();
    gotPlate = checkPlate(plate);
}
carObject.setLicensePlate(plate);

现在将其余逻辑放入checkPlate方法:

static boolean checkPlate(String plate) {
    // Fixed typos here, by the way...
    for (int index = 0; index < 2; index++) {
        char sign = plate.charAt(index);
        if (sign < 'A' || sign > 'Z') {
            System.out.println(plate + " is not a valid license plate " + 
               "(two big letters + five digits where the first digit" + 
               " can not be 0)");
            return false;
        }
    }
    // Now do the same for the next bits...


    // At the end, if everything is valid, return true
    return true;
}

我会让你去检查'0'等等 - 但希望你能看到将“测试”部分与“获取输入”部分分开构建的好处。


编辑:原始答案......

听起来你想要一个正则表达式:

Pattern pattern = Pattern.compile("[A-Z]{2}[1-9][0-9]{4}");

完整样本:

import java.util.regex.*;

public class Test {

    private static final Pattern PLATE_PATTERN =
        Pattern.compile("[A-Z]{2}[1-9][0-9]{4}");

    public static void main(String args[]) {
        checkPlate("AB10000");
        checkPlate("AB10000BBB");
        checkPlate("AB1CCC0BBB");
    }

    static void checkPlate(String plate) {
        boolean match = PLATE_PATTERN.matcher(plate).matches();
        System.out.println(plate + " correct? " + match);
    }
}

当然,这并不能告诉你哪个是错误的。它也无法帮助您找出原始代码的错误...请参阅前面的部分。

答案 1 :(得分:0)

不要使用基于角色的方法。取整个字符串并使用上面的正则表达式列表,然后失败或将其作为一次性操作传递。您不需要此级别的控制来获得通过/失败结果。

HTH, 詹姆斯

答案 2 :(得分:0)

你应该使用正则表达式。

但是,如果你想解决你的代码问题:你的方法的问题是你在完成一些验证后再次要求输入。

例如,如果前两个字符正确,则第二个循环将单手验证输入。如果这是错误的并且它再次要求输入,则用户可能错误地输入前两个字符并且不会进行检查,因为代码将通过第一阶段并且现在仅检查第二阶段。

如果你继续你的方法,你应该做一个大循环,如果输入中有任何错误,它会重复,并按顺序再次进行所有检查。