你好我发现了一个与断言相关的问题。它要求哪些行适当地使用了断言语句。
23. int =5;
24.
25. public void stuff1(int x){
26. assert(x>0);
27. switch(x){
28. case 2:x=3;
29. default:assert false;
}
}
30.
31. private void stuff2(int y){
assert(y<0);
}
32.
33. private void stuff3(){
assert(stuff4());
}
34.
35. private boolean stuff4(){
z=6;
return false;
}
正确答案是“第29行和第31行的断言陈述被恰当地使用”。
但是我觉得在第29行使用assert是没用的,因为它总是会产生断言错误。如果x仍然是2,则默认将运行并且将给出断言错误。为什么答案说它已适当地使用了第29行中的断言。请有人解释我。
而且我觉得第33行中的断言不会被占用,因为再次stuff4()方法调用将始终返回false并且断言将始终为false。这是对的吗?
答案 0 :(得分:1)
断言(假)很好。它是评论的机器可读版本
// should never be reached
我一直认为断言是机器可读(和可执行的)评论
断言(stuff4())是不同的。看起来它正在测试stuff4的返回值。这很糟糕,因为在非调试版本中,stuff4不会被调用(对于大多数断言实现);通常,assert宏在非调试版本中编译为空白
答案 1 :(得分:1)
第29行的断言声明x的任何其他值都不是2,一般来说,它确保的开关案例块只有定义的情况有效,而默认情况不是。
第33行的断言不合适,因为它取决于不用于检查的方法的结果,所以是的,你是对的。
答案 2 :(得分:0)
根据断言规则,您不能使用断言来验证公共方法参数,因此第26行的断言不合适。
我们也可以在流量不得去的地方使用断言,或者说假装永远不会发生的情况。所以,这里的流程不应该是默认情况。 (但是因为不存在break语句,AssertionError将存在)。这就是第29行断言的原因。
第31行的断言正确用于验证私有方法参数。
第33行断言是不合适的,因为它不会使程序处于与断言之前相同的状态。如果断言被禁用,它将不会运行代码。