虽然通过一些旧代码的样子,我碰到这种宝石:
MyObject o = new MyObject("parameter");
if (o == null) o = new MyObject("fallback parameter");
第二行被标记在Eclipse死代码,我明白为什么。 也不例外似乎是明确地抛出,而这是不可能的MyObject
构造函数抛出任何类型的异常(如NullPointerException
S)。
我的问题是,为什么有一个空检查? 在构造函数中旧版本的Java是它以前可能返回null? 还是这根本没用,死代码?
该代码是死在Java中的任何版本。 这是不可能的构造函数返回null
,即使异常从构造函数中被抛出,下一行就不会被调用。
不,它从来没有可能。 也许代码的先前版本使用的一些工厂方法可能返回null:
MyObject o = createMyObject("parameter");
if (o == null) o = createMyObject("fallback parameter");
从JLS的第15.9.4 :
一个类的实例的创建表达式的值是将指定的类的新创建的对象的引用。 每次表达式求值时,创建新的对象。
所以,不,它永远不能返回null。
我的猜测是,它是由一个C程序员谁是用来测试的返回值malloc()
为NULL
, malloc()
可以返回NULL
,如果你的系统运行内存不足。
该代码是没有意义的在Java中,因为如果内存用完Java将抛出一个OutOfMemoryError`。
答案很简单:谁写代码的人是个偏执的C ++程序员。 在C ++中,你可以重载operator new和使用它作为一个简单的内存分配器(又名的malloc)。
这只是usesless死代码。 一旦CTOR已成功执行,你必须参考的对象。
当你创建一个新的对象(),你在内存中创建一个地址,这个地址是不是“空”,但你的对象可能是空的。
你必须测试“空”通过参数传递对象。
它只是死代码。
new MyObject("parameter")
将不会返回null
在Java中的任何版本。
正如我今天发现,尽管什么在所有其他的答案说, Foo x = new Foo(...)
的确可以返回null,如果说代码使用测试中运行PowerMock (或具有类似效果的其他一些嘲讽框架) :
PowerMockito.whenNew(Foo.class).withAnyArguments().thenReturn(mockFoo);
在这种情况下,foo的构造函数(或多个)代码的完全跳过new Foo(...)
但是,如果你写的,你不能指定上述的方式模拟测试,你可能会结束null
代替。
但是,即使你使用的是这样一个框架,你不想额外的代码在你的班,只是为了妥善处理,你忘了正确嘲笑在测试对象的情况下! 这不是一个真实世界的场景,你的代码是为了运行。 测试时,这只是曾经被激活代码本来也应该淘汰了,在这种情况下,将永远只能是积极的断试验。
所以,即使你使用PowerMock,即第二行应该理所当然地被认为是“死代码”和删除。