这是代码的骨架:
flag1=True
flag2=True
do {
try {
if (){
throw new IllegalArgumentException();
}
.
.
.
do {
if () {
}
else {
}
.
.
.
if () {
}
} while (flag2);
flag1 = false;
} catch (RuntimeException ex) {
flag1 = true;
} catch (Exception ex) {
flag1 = true;
} catch (Error ex) {
flag1= true;
}
}
} while (flag1);
}
我正在使用junit4进行测试。我还需要覆盖所有 try catch block 以进行测试。 我编写了一个满足第一个 if 条件的测试用例,因此抛出非法参数异常,但抛出异常后,代码移动到 do 循环,且 flag1 始终保持 true。
最佳答案
首先,听起来您可能是一名 Java 初学者。如果是这样的话,我建议您阅读 Java 中的异常处理。我认为这会让您很容易理解这种行为的原因。以下是 Oracle 提供的有关该主题的一些快速教程:https://docs.oracle.com/javase/tutorial/essential/exceptions/
话虽如此,以下是我对导致您所描述的行为的原因的解释: 1. flag1
仍然为 true。 2.循环不停止。
1.
flag1
未设置为 true 的原因是,当抛出 IllegalArgumentException 时,抛出位置和异常 catch block 之间的所有代码都将被跳过。这包括跳过行 flag1 = false;
。
2.
抛出 IllegalArgumentException 时 while 循环不退出的原因是 IllegalArgumentException 继承自 RuntimeException,如下所示: https://docs.oracle.com/javase/7/docs/api/java/lang/IllegalArgumentException.html 。这意味着您的 catch block catch (RuntimeException ex)
将捕获抛出的异常。因此,将会执行 RuntimeException catch block (retry = true;
) 中的代码,然后从 try-catch block 之后继续执行。由于这仍在外部 do-while 循环内,因此循环将继续。
关于java - 嵌套 do while 循环的 Junit 测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61476765/