构造函数可以返回一个空对象吗?
在浏览一些旧代码时,我碰到了这个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()
的返回值NULL
, malloc()
可以返回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; }
不知道为什么呢。