关于java 中的assert 关键字

来源:互联网 发布:json转数组 编辑:程序博客网 时间:2024/05/22 06:54

不要用assert 来检查 参数是否合法,要检查就这样写:

 

 

if(upbound < 0)

{

  throw new IllegalArgumentException("upbound must be positive");

}

 

 

 

那assert 是用来干什么的呢?

 

以下是转载部分

 

 

JAVA中assert用法和注意
2009年11月10日 星期二 21:07

23.int z=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; } 
Which is true? 
A. All of the assert statements are used appropriately. 
B. Only the assert statement on line 31 is used appropriately. 
C. The assert statements on lines 29 and 31 are used appropriately. 
D. The assert statements on lines 26 and 29 are used appropriately. 
E. The assert statements on lines 29 and 33 are used appropriately. 
F. The assert statements on lines 29, 31, and 33 are used 
appropriately. 
G. The assert statements on lines 26, 29, and 31 are used 
appropriately.

 

 

 

23.int z=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… 


首先,这道题问的是哪些行的断言的使用是适当的,而并不是能够通过编译的。 
实际上,代码是可以编译通过的。 
问题是要找出哪些的用法是恰当的。 

断言的使用,有如下几个原则: 
1.不要使用断言验证公共方法的参数。 
2.可以使用断言验证私有方法的参数。 
3.不要使用断言验证命令行参数 
4.在公共方法内,可以使用断言检查从不会发生的情况 


比如,switch中的default 
像下面的应用就是适当的 

Java code
switch(x){ case 1: y=1; break; case 2: y=2; break; default: assert false; }

你可以假设x为1或者2,所以default可以认为是不可到达的,这个时候可以使用断言 

5.不要使用可能产生副作用的断言 
也就是断言表达式应该使程序保持在进入它之前的状态。 

所以,根据上述5点, 
可以判断出 
26行的断言使用不恰当,因为它是用来验证了一个公共方法。 
29行的也不恰当,因为28行的后面并没有break语句,也就是说如果进入了case2,则一定会执行default的内容 
31行的使用是正确的,因为用断言验证的是一个私有的方法 
33行的使用是不恰当的,因为stuff4()肯定返回一个false,所以33行肯定会抛出AssertionError,这个违反了第5个原则 

综上所述,偶认为答案是 B

原创粉丝点击