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?或者这只是无用的死代码?
JB *_*zet 52
不,这是不可能的.也许以前版本的代码使用了一些可以返回null的工厂方法:
MyObject o = createMyObject("parameter");
if (o == null) o = createMyObject("fallback parameter");
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 49
类实例创建表达式的值是对新创建的指定类对象的引用.每次计算表达式时,都会创建一个新对象.
所以不,它永远不会返回null.
Jac*_*nds 23
我的猜测是,它是由一个C程序员谁是用来测试的返回值malloc()的NULL, malloc()可以退货NULL,如果你的系统运行内存不足.
代码在Java中没有意义,因为如果内存不足,Java将抛出OutOfMemoryError`.
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,第二行也应该被正确地视为“死代码”并删除。
| 归档时间: |
|
| 查看次数: |
38989 次 |
| 最近记录: |