听起来像一个明显答案的愚蠢问题:)
仍然我冒昧地要求加倍确认。
我们确实使用了如下所示的断言
ArrayList alProperties = new ArrayList();
assert alProperties != null : "alProperties is null";
问题是制作一个小&关于断言的简单文件很难。有很多关于断言的书籍,但理想情况下,我喜欢给一个新的程序员非常简单的使用类似断言的指南。顺便说一下,像pmd这样的工具是否检查了断言的正确用法?
提前致谢。
答案 0 :(得分:19)
没有理由使用这样的断言。如果由于某种原因不会创建对象,则甚至不会到达您的断言(例如,抛出异常或退出VM)
答案 1 :(得分:6)
在Sun的Programming with Assertions中使用断言有一些相当简明的指导原则。该文建议断言应该用于内部不变量,控制流不变量,前置条件,后置条件和类不变量等。
答案 2 :(得分:4)
不,您不想检查对象创建。
如果对象创建失败,jvm将抛出一个OutOfMemoryError,如果发生这种情况,你可能会被修复无法修复。
答案 3 :(得分:3)
这就像不信任JVM一样。关于你作为一个给定的东西,你必须在某处画一条线......
答案 4 :(得分:3)
在Java中,每次调用new都会返回对新对象的非null引用,或者引发Exception或Error。在第一种情况下,你的断言是真的,在第二种情况下,断言将不会到达,因为你在下一个匹配的catch块中结束。
这个断言测试你的Java实现是否被破坏,在这种情况下你甚至不能依赖断言。所以我不会做出这样的断言。将assert用于对象的限制,这些限制不是由语言强制执行的(例如,如果您的方法传递的参数为null但不应该是)。
答案 5 :(得分:3)
这个断言只会使你的代码混乱,它等同于这个断言:
boolean a = true;
assert a : "A should be true"
您不应该测试您的JVM,除非这是您的程序的重点(例如,它是您正在制作的JVM的测试套件)。相反,你应该测试你的前提条件,后置条件和不变量。有时这些测试太基本或太昂贵。
前提条件可能只应出现在方法的开头(如果你有很长的方法,那么你应该把那个方法分成小部分,即使它们都是私有的。)
后置条件应该清楚你已经返回给调用者的内容,你没有测试sqrt函数刚刚返回sqrt,但你可能会测试它是肯定的,以明确你期望的东西(也许以后的代码使用复数,而你的代码没有经过测试。而是在底部留下评论。
不变量也经常无法测试,你不能测试你当前的解决方案是正确的部分解决方案(见下文) - 尽管这是用尾递归编写东西的好东西之一。相反,您使用注释声明不变量。
如果你在外部调用东西,你也可以使用一个断言,例如在你的例子中,如果你有ArrayList.Create()
,那么你可以选择null
的断言检查。但只是因为你不相信其他代码。如果您编写了该代码,则可以将断言(注释或其他)放在工厂方法本身中。
int max(int[] a, int n) {
assert n <= a.length : "N should not exceed the bounds of the array"
assert n > 0 : "N should be at least one"
// invariant: m is the maximum of a[0..i]
int m = a[0];
for( int i = 1; i < n; n++ ) {
if( m < a[i] )
m = a[i];
}
// if these were not basic types, we might assert that we found
// something sensible here, such as m != null
return m;
}
答案 6 :(得分:1)
我不确定完全理解你的问题,但我认为那种断言不是必要的。
创建实例时,如果程序流继续,则实例不是空引用。
答案 7 :(得分:0)
您希望ASSERTS检查程序的属性或不变量。教这个的好文件应该鼓励程序员以系统/有条理的方式思考这些属性。
答案 8 :(得分:0)
如果断言失败,相信我,你会遇到更大的问题,而不仅仅是处理断言。
如果断言失败,我认为是时候寻找另一份工作了,因为计算机没有表现出它的表现,当这种情况发生时,一切都将破裂!