无法理解java断言机制

时间:2015-05-31 04:19:39

标签: java assert

这个程序是SCJP问题书中的一个问题

class One {
    int x = 0;
    {
        assert x == 1;
    }
}

public class Two {
    public static void main(String[] args) {
        int y = 0;
        assert y == 0;
        if(args.length > 0)
            new One();
    }
}

以下哪项会毫无错误地运行? 给出的选项是

A. java Two
B. java Two x
C. java -ea Two
D. java -ea Two x
E. java -ea:One Two
F. java -ea:One Two x
G. java -ea:Two Two x

正确的选项是A,B,C,E和G

D和F不正确的原因是,创建了One的实例。如果创建One的实例,我不明白为什么会出现问题。

在选项B和G中,还创建了One的实例,那么为什么它对D和F来说是个问题?

2 个答案:

答案 0 :(得分:2)

为了让断言做任何事情,必须启用它。 A和B根本没有启用断言。 G只为类\s启用了它们。

D和F都为类Two启用了断言并创建了一个实例。

答案 1 :(得分:2)

  

我不明白为什么如果创建One的实例会出现问题。

因为One包含assert,但在实例化时会保证失败(并且这些选项会在args中传递);

中的0 != 1
class One {
    int x = 0;
    {
        assert x == 1;
    }
}

此外,在选项B中,未启用断言,并且在选项G中,断言仅在类Two中启用(并且有问题的断言在类One中)。