无法理解 java 断言机制

Could not understand java assert mechanism

这个程序是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有问题?

为了使断言能够执行任何操作,必须启用它。 A 和 B 根本没有启用断言。 G 只为 class Two.

启用了它们

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

I don't understand why it would be a problem if an instance of One is created.

因为One包含一个assert,它在实例化时肯定会失败(并且那些选项在args中传递); 0 != 1

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

此外,在选项 B 中断言未启用,在选项 G 中断言仅在 class Two 中启用(有问题的断言在 class One).