我正在用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);
如果有人能帮我写这篇文章,我将非常感激!
答案 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)
你应该使用正则表达式。
但是,如果你想解决你的代码问题:你的方法的问题是你在完成一些验证后再次要求输入。
例如,如果前两个字符正确,则第二个循环将单手验证输入。如果这是错误的并且它再次要求输入,则用户可能错误地输入前两个字符并且不会进行检查,因为代码将通过第一阶段并且现在仅检查第二阶段。
如果你继续你的方法,你应该做一个大循环,如果输入中有任何错误,它会重复,并按顺序再次进行所有检查。