构造函数可以返回一个空对象吗?

在浏览一些旧代码时,我碰到了这个gem:

MyObject o = new MyObject("parameter"); if (o == null) o = new MyObject("fallback parameter"); 

第二行在Eclipse中被标记为死代码,我明白为什么。 似乎没有exception显式抛出,并且MyObject构造函数不可能抛出任何types的exception(如NullPointerException )。

我的问题是为什么有一个空检查? 以前是否可以在旧版本的Java中为构造函数返回null? 或者这是无用的和死代码?

该代码是死在任何版本的Java。 构造函数不可能返回null ,即使构造函数抛出exception,下一行也不会被调用。

不,从来没有可能。 也许以前版本的代码使用了一些可能返回null的工厂方法:

 MyObject o = createMyObject("parameter"); if (o == null) o = createMyObject("fallback parameter"); 

从JLS第15.9.4节 :

类实例创buildexpression式的值是对新创build的指定类的对象的引用。 每次评估expression式时,都会创build一个新的对象。

所以不,它永远不会返回null。

我的猜测是它是由一个C编程人员用来testingmalloc()的返回值NULLmalloc()可以返回NULL如果你的系统内存不足。

代码在Java中没有意义,因为如果内存不足,Java将抛出一个OutOfMemoryError。

答案很简单:编写代码的人是一个偏执的c ++程序员。 在C ++中,您可以重载operator new,并将其用作简单的内存分配器(又名malloc)。

这是无用的死代码。 一旦CTOR成功执行,就可以引用该对象。

当你创build一个新的Object()时 ,你在内存中创build一个地址,这个地址不是'null',但是你的Object可能是空的。

您必须为通过参数传输的对象testing'null'。

这只是无用的代码。

new MyObject("parameter")不会在任何版本的Java中返回null

正如我今天所发现的那样,尽pipe在所有其他答案中都说了什么,但如果所述代码在使用PowerMock的testing中运行(或者具有类似效果的其他模拟框架Foo x = new Foo(...) ,则Foo x = new Foo(...)确实可以返回null, :

 PowerMockito.whenNew(Foo.class).withAnyArguments().thenReturn(mockFoo); 

在这种情况下,Foo的构造函数中的代码完全绕过new Foo(...) 。 但是,如果你写了一个testing,你没有以上述方式指定模拟,你可能会以null结束。

即使你使用这样的框架,你也不需要额外的代码在你的类中,只是为了妥善处理你忘了在testing中正确地模拟对象的情况! 您的代码有意运行的并不是真实的场景。 只有在testing时才会被激活的代码应该被消除,在这种情况下,它只会被激活以便进行破坏testing。

所以,即使你使用PowerMock,第二行应该被认为是“死代码”,并被删除。

如果第二行是死的,第一行是创build对象的唯一方法,那么我猜NullPointerExceptionexception永远不会发生! (除非你运行类似0.aMethod() ,但是我听说在java中甚至整数都是对象,所以也许你的语言不能有指针 – 你不能有空指针。)在上面的讽刺交易!)

它已经发生在我重写的方法toString

 public String toString(){ return description; } 

不知道为什么呢。