捕获异常后,如何不增加for循环?

时间:2018-06-19 20:47:31

标签: java

这里是我的老师提示:

  

将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值。捕获异常后,我不增加循环吗?我试着继续;方法,编译器说代码不可访问。请帮助!

3 个答案:

答案 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. } } 块更改为仅打印错误消息,而不是引发异常。