这里是我的老师提示:
将FORT / WHILE LOOP内的CATCH子句放在TRY块中,以便从以下位置抛出SPECIFIC异常 构造函数,您将显示一条错误消息,并且显示NOT INCREMENT 柜台。
这是我的构造函数和这部分的代码:
public CreditCardNumber(String id, String accNum) {
this();
if (id == null || accNum == null || id.length() != 6 || accNum.length() != 9 ||
isDigit(id) == false || isDigit(accNum) == false) {
throw new IllegalArgumentException("Either parameter is null or has incorrect length or doesn't have all digits");
} else {
accountNum = accNum;
issuerId = id;
setCheckDigit();
}
}
///
for (int i = 0; i < arrLength; i++) {
try {
System.out.println("Enter an issuer ID# (6 digits) for element #" + i);
String issuerId = scanner.next();
System.out.println("Enter an account # (9 digits) for element #" + i);
String accountNum = scanner.next();
CreditCardNumber obj = new CreditCardNumber(issuerId, accountNum);
obj.changeId(issuerId);
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException("Invalid Input, Try Again!")
continue;
}
}
现在,我遇到的麻烦是如何实现此代码,以便在捕获到异常之后,该代码重新提示用户输入与捕获异常相同的i值。捕获异常后,我不增加循环吗?我试着继续;方法,编译器说代码不可访问。请帮助!
答案 0 :(得分:3)
不要使用一元i
运算符在for循环的第三部分中增加++
,而只需在try块的末尾执行即可:
for (int i = 0; i < arrLength;) { // removed here
try {
System.out.println("Enter an issuer ID# (6 digits) for element #" + i);
String issuerId = scanner.next();
System.out.println("Enter an account # (9 digits) for element #" + i);
String accountNum = scanner.next();
CreditCardNumber obj = new CreditCardNumber(issuerId, accountNum);
obj.changeId(issuerId);
i++; // added here
} catch (IllegalArgumentException e) {
System.out.println("Invalid Input, Try Again!"); // don't throw just print
}
}
我也建议您以
的形式替换构造函数中的布尔检查if(variable == false){...}
仅
if(!variable){...}
答案 1 :(得分:1)
在捕获异常时,在捕获块中使用--i
递减循环计数器。
最好的方法是在没有异常的情况下增加循环计数器,并在出现异常时继续使用。
for (int i = 0; i < arrLength; i++) {
try {
System.out.println("Enter an issuer ID# (6 digits) for element #" + i);
String issuerId = scanner.next();
System.out.println("Enter an account # (9 digits) for element #" + i);
String accountNum = scanner.next();
CreditCardNumber obj = new CreditCardNumber(issuerId, accountNum);
obj.changeId(issuerId);
} catch (IllegalArgumentException e) {
System.out.println("Invalid Input, Try Again!")
i--; //<- this what you want ignore fault input
continue;
}
}
答案 2 :(得分:1)
您可以通过while循环实现相同的逻辑。
ValidationError: Recipe validation failed: comments.0.author: Cast to ObjectId failed for value "@funnybobby" at path "author", validatedBy: Cast to [ObjectId] failed for value "["@funnybobby"]" at path "validatedBy"
请注意,我将int i = 0;
while (i < arrLength) {
try {
System.out.println("Enter an issuer ID# (6 digits) for element #" + i);
String issuerId = scanner.next();
System.out.println("Enter an account # (9 digits) for element #" + i);
String accountNum = scanner.next();
CreditCardNumber obj = new CreditCardNumber(issuerId, accountNum);
obj.changeId(issuerId);
i++;
} catch (IllegalArgumentException e) {
// print the error message instead of throwing an exception
System.out.println("Invalid Input, Try Again!");
// don't increment the counter.
}
}
块更改为仅打印错误消息,而不是引发异常。