这里是代码的骨架:
flag1=True
flag2=True
do {
try {
if (){
throw new IllegalArgumentException();
}
.
.
.
do {
if () {
}
else {
}
.
.
.
if () {
}
} while (flag2);
flag1 = false;
} catch (RuntimeException ex) {
retry = true;
} catch (Exception ex) {
flag1 = true;
} catch (Error ex) {
flag1= true;
}
}
} while (flag1);
}
我正在使用junit4进行测试。我还需要涵盖所有的try catch块以进行测试。我编写了一个满足第一个if条件的测试用例,因此引发了非法参数异常,但是在引发异常之后,代码移至do循环,并且flag1始终为true。
开始时,听起来您可能是Java初学者。如果是这样,我建议您阅读一下Java中的异常处理。我认为这将使您更容易理解此行为的原因。这是Oracle上有关该主题的一些快速教程:https://docs.oracle.com/javase/tutorial/essential/exceptions/
话虽如此,这是我对导致您描述的行为的原因的解释:1. flag1
仍然为真。 2.循环不会停止。
1。未将flag1
设置为true的原因是,当抛出IllegalArgumentException时,将抛出该位置到异常捕获块之间的所有代码。这包括跳过flag1 = false;
行。
2。抛出IllegalArgumentException时while循环没有退出的原因是,IllegalArgumentException继承自RuntimeException,如您在此处看到的:https://docs.oracle.com/javase/7/docs/api/java/lang/IllegalArgumentException.html。这意味着您的catch块catch (RuntimeException ex)
将捕获引发的异常。因此,将执行RuntimeException catch块(retry = true;
)中的代码,然后从try-catch块之后继续执行。由于这仍在外部do-while循环内,因此循环将继续。