我正在回答Java测试并遇到问题:
以下哪项陈述属实?
一个。在断言语句中,冒号(:)之后的表达式可以 是任何Java表达式。
B中。如果开关块没有默认值,则认为添加断言默认值是合适的。
℃。在断言语句中,如果冒号(:)之后的表达式没有 值,assert的错误消息将为空。
d。使用catch子句处理断言失败是合适的。
正确的答案是B
。说实话,我通过排除另一个明显错误的案例回答了这个问题,但实际上我无法理解这个问题。谁能解释为什么这是真的?它在哪里可以提供帮助?
答案 0 :(得分:9)
我想这意味着你应该保护自己不要错过开关盒。
假设您在代码中有enum Color {red, green}
和此开关:
switch(color) {
case red:
doSomethingRed();
break;
case green:
doSomethingGreen();
break;
}
如果将来添加新颜色blue
,您可能会忘记在交换机中添加一个案例。
将失败的断言添加到默认情况下将抛出AssertionError,您将发现错误。
switch(color) {
case red:
doSomethingRed();
break;
case green:
doSomethingGreen();
break;
default:
assert false : "Oops! Unknown color"
}
答案 1 :(得分:4)
这取决于案例,但取决于我看待它的方式
// Consider expecting only 1,2 or 3 as switch case
switch(x)
{
case 1:
// operations
break;
case 2:
// operations
break;
case 3:
// operations
break;
default: assert false : "Input should be between 1-3";
}
可能很方便,因为您可能收到的任何其他输入都可能被视为错误的输入。
答案 2 :(得分:2)
在切换块的默认值中使用assert false
适用于公共方法上下文,例如
public void methA(int x) throws Exception {
if(x!=1 && x!=2 && x!=3)
throw new IllegalArgumentException("from Exception: x should be between 1,2 and 3");
switch(x)
{
case 1: doSomething(); break;
case 2: doSomething(); break;
case 3: doSomething(); break;
default: assert false : "from default: x should be between 1,2 and 3";
}
}
如果在公共方法中使用了switch块,那么检查参数x的值已经在switch语句之前由异常处理。
因此,即使您在默认情况下使用assert false
,也永远无法访问该代码,因为假设x为1,2或3始终为真。如果不是,则在交换机默认之前已由IllegalArgumentException处理。所以基本上,永远不会达到switch-default的假设总是如此。因此,它适用于公共方法。