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

Jon*_*tre 74 java null constructor

在查看一些旧代码时,我遇到了这个宝石:

MyObject o = new MyObject("parameter");
if (o == null) o = new MyObject("fallback parameter");
Run Code Online (Sandbox Code Playgroud)

第二行在Eclipse中标记为死代码,我理解为什么.似乎没有显式抛出任何异常,并且MyObject构造函数不可能抛出任何类型的异常(例如NullPointerExceptions).

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

tib*_*tof 91

代码在任何版本的java中都是死的.构造函数不可能返回null,即使从构造函数抛出异常,也不会调用下一行.


JB *_*zet 52

不,这是不可能的.也许以前版本的代码使用了一些可以返回null的工厂方法:

MyObject o = createMyObject("parameter");
if (o == null) o = createMyObject("fallback parameter");
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 49

JLS第15.9.4节开始:

类实例创建表达式的值是对新创建的指定类对象的引用.每次计算表达式时,都会创建一个新对象.

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

  • @AhamadAnees:听起来我不太可能.如果你仍然认为是这种情况,我建议你发一个[mcve]作为一个新问题. (2认同)
  • @AhamadAnees:添加评论无济于事。正如我所说,我认为您误诊的可能性要大得多,而不是 Android 上的 Java *实际上* 表现得那样……但是如果您不能,也许您需要在 Android 帮助论坛上提问在这里问。(或者也许你应该改进你的旧问题,以便你*可以*在这里发布新问题......) (2认同)

Jac*_*nds 23

我的猜测是,它是由一个C程序员谁是用来测试的返回值malloc()NULL, malloc()可以退货NULL,如果你的系统运行内存不足.

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

  • 实际上它是[`OutOfMemoryError`](http://docs.oracle.com/javase/7/docs/api/java/lang/OutOfMemoryError.html);-) (5认同)

Zac*_*son 11

正如我今天发现的,尽管所有其他答案中都有所述,如果所述代码在使用PowerMock(或具有类似效果的其他一些模拟框架)的Foo x = new Foo(...)测试中运行,则确实可以返回 null :

PowerMockito.whenNew(Foo.class).withAnyArguments().thenReturn(mockFoo);
Run Code Online (Sandbox Code Playgroud)

在这种情况下, Foo 的构造函数中的代码被完全绕过new Foo(...)。但是,如果您编写的测试未能以上述方式指定模拟,则null最终可能会出现这种情况。

即使您使用这样的框架,您也不希望在类中添加额外的代码,只是为了优雅地处理您忘记在测试中正确模拟对象的情况!这不是的代码打算运行的真实场景。无论如何,应该消除仅在测试时才有效的代码,在这种情况下,它只会在损坏的测试中才有效。

因此,即使您使用 PowerMock,第二行也应该被正确地视为“死代码”并删除。


kof*_*ann 8

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