使用断言的恰当性

时间:2014-08-06 05:23:37

标签: assertions

你好我发现了一个与断言相关的问题。它要求哪些行适当地使用了断言语句。

        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。这是对的吗?

3 个答案:

答案 0 :(得分:1)

断言(假)很好。它是评论的机器可读版本

// should never be reached

我一直认为断言是机器可读(和可执行的)评论

断言(stuff4())是不同的。看起来它正在测试stuff4的返回值。这很糟糕,因为在非调试版本中,stuff4不会被调用(对于大多数断言实现);通常,assert宏在非调试版本中编译为空白

答案 1 :(得分:1)

第29行的断言声明x的任何其他值都不是2,一般来说,它确保的开关案例块只有定义的情况有效,而默认情况不是。

第33行的断言不合适,因为它取决于不用于检查的方法的结果,所以是的,你是对的。

答案 2 :(得分:0)

  1. 根据断言规则,您不能使用断言来验证公共方法参数,因此第26行的断言不合适。

  2. 我们也可以在流量不得去的地方使用断言,或者说假装永远不会发生的情况。所以,这里的流程不应该是默认情况。 (但是因为不存在break语句,AssertionError将存在)。这就是第29行断言的原因。

  3. 第31行的断言正确用于验证私有方法参数。

  4. 第33行断言是不合适的,因为它不会使程序处于与断言之前相同的状态。如果断言被禁用,它将不会运行代码。