Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我们应该断言java中的每个对象创建吗?_Java_New Operator_Assert - Fatal编程技术网

我们应该断言java中的每个对象创建吗?

我们应该断言java中的每个对象创建吗?,java,new-operator,assert,Java,New Operator,Assert,听起来像一个愚蠢的问题,答案显而易见:) 尽管如此,我还是大胆地问了一个问题,就是要加倍肯定 我们确实在使用下面给出的资产 ArrayList alProperties = new ArrayList(); assert alProperties != null : "alProperties is null"; 问题是,制作一个小而简单的文档来跟踪资产是很困难的。有很多关于断言的书,但理想情况下,我喜欢给一个新的程序员提供关于使用类似断言的东西的非常简单的指导。顺便问一下,pmd之类的工具

听起来像一个愚蠢的问题,答案显而易见:)

尽管如此,我还是大胆地问了一个问题,就是要加倍肯定

我们确实在使用下面给出的资产

ArrayList alProperties = new ArrayList();

assert alProperties != null : "alProperties is null";
问题是,制作一个小而简单的文档来跟踪资产是很困难的。有很多关于断言的书,但理想情况下,我喜欢给一个新的程序员提供关于使用类似断言的东西的非常简单的指导。顺便问一下,pmd之类的工具是否检查资产的正确使用


提前感谢。

没有合理的理由使用这样的资产。如果由于某种原因无法创建对象,您的断言甚至无法到达(例如,因为引发了异常或VM退出)

我不确定是否完全理解您的问题,但我认为这种断言是不必要的


创建实例时,如果程序流继续,则该实例不是空引用。

您希望断言检查程序的属性或不变量。一个好的文档来教授这一点应该鼓励程序员以系统的/有条理的方式考虑这些属性。

这就像不信任JVM一样。关于你认为什么是给定的,你必须在某处画一条线……

关于在Sun的声明中使用断言,有一些相当简洁的指导原则。那篇文章建议断言应该用于内部不变量、控制流不变量以及前置条件、后置条件和类不变量。

不,您不想检查对象创建


如果对象创建失败,jvm将抛出OutOfMemoryError,如果发生这种情况,您很可能无法修复。

如果断言失败,相信我,您将遇到比处理断言更大的问题


如果这个断言失败了,我想是时候找另一份工作了,因为电脑的运行方式不符合预期,一旦发生这种情况,一切都会变得一团糟

在Java中,每次调用new都会返回对新对象的非空引用,或者引发异常或错误。在第一种情况下,您的断言为true,在第二种情况下,将无法到达断言,因为您将在下一个匹配的catch块中结束


这个断言测试您的Java实现是否被破坏,在这种情况下,您甚至不能依赖断言。所以我不会做出这样的断言。使用assert限制语言未强制执行的对象(例如,如果向方法传递的参数为null但不应为null)。

此assert只会使代码混乱,它将等效于此assert:

boolean a = true;
assert a : "A should be true"
你不应该测试你的JVM,除非这是你程序的重点(比如说,它是你正在制作的JVM的测试套件)。相反,您应该测试您的前置条件、后置条件和不变量。有时这些测试太基本或太昂贵

前置条件可能只应该出现在方法的开头(如果您有很长的方法,那么您应该将该方法分成几个小部分,即使它们都是私有的)

Post条件应该明确您返回给调用方的是什么,您不需要测试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;
}
int max(int[]a,int n){
断言n0:“n应至少为一”
//不变量:m是[0..i]的最大值
int m=a[0];
对于(int i=1;i
除非“new”和“assert”之间有大量代码,这可能会修改“alProperty”。当然可以。但是在这个例子中,它之间没有任何代码,即使有,我也不认为断言是正确的。。。。不相信自己。在开发时,您应该有测试来告诉您何时出错。然后,在运行时,您应该对编写良好的代码充满信心——除非另有证明。