Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于NPE和单行上的多个表达式的最佳实践_Java_Nullpointerexception - Fatal编程技术网

Java 关于NPE和单行上的多个表达式的最佳实践

Java 关于NPE和单行上的多个表达式的最佳实践,java,nullpointerexception,Java,Nullpointerexception,我想知道,对于可能的NPE,避免在同一线路上多次呼叫是否是一种公认的做法,如果是,在什么情况下。例如: anObj.doThatWith(myObj.getThis()); vs 后者更详细,但如果有NPE,您会立即知道什么是null。但是,它还需要为变量和更多导入语句创建名称 所以我的问题是: 这个问题值得吗 到处设计?去更好吗 第一种或第二种可能性 创建变量名是否会对性能产生影响 是否有更改例外情况的建议 消息,以便能够确定 对象在的未来版本中为null 爪哇 政府明确表示,根本不要这样

我想知道,对于可能的NPE,避免在同一线路上多次呼叫是否是一种公认的做法,如果是,在什么情况下。例如:

anObj.doThatWith(myObj.getThis());
vs

后者更详细,但如果有NPE,您会立即知道什么是
null
。但是,它还需要为变量和更多导入语句创建名称

所以我的问题是:

  • 这个问题值得吗 到处设计?去更好吗 第一种或第二种可能性
  • 创建变量名是否会对性能产生影响
  • 是否有更改例外情况的建议 消息,以便能够确定 对象在的未来版本中为
    null
    爪哇
政府明确表示,根本不要这样做

这个问题值得设计吗?选择第一种或第二种可能性更好吗

IMO,没有。请选择最具可读性的代码版本

如果您得到无法诊断的NPE,请根据需要修改代码。或者,使用调试器运行它,并使用断点和单步执行找出空指针的来源

创建变量名是否会对性能产生影响

添加额外变量可能会增加堆栈帧大小,或者可能会延长某些对象保持可访问状态的时间。但这两种影响都不太可能显著

是否有建议更改异常消息,以便能够确定未来版本的Java中哪个对象为空


我不知道。实现这样一个功能可能会有显著的性能下降。

如果您确定
getThis()
不能返回
null
值,那么第一个变量就可以了。您可以在代码中使用契约注释来检查这些条件。例如,Parasoft JTest使用类似于
@post$result!=null
并标记所有不带注释的方法,这些方法使用返回值而不进行检查

如果该方法可以返回
null
,则代码应始终使用第二个变量,并检查返回值只有您可以决定如果返回值为null,该操作可能正常,或者您可能希望记录错误:

Object o = getThis();

if (null == o) {
    log.error("mymethod: Could not retrieve this");
} else {
    o.doThat();
}

就我个人而言,我不喜欢一行代码的“设计模式”,所以我站在所有那些说保持代码可读性的人一边。尽管我在现有项目中看到了与此类似的糟糕得多的代码行:

someMap.put(
     someObject.getSomeThing().getSomeOtherThing().getKey(),
     someObject.getSomeThing().getSomeOtherThing()) 
我认为没有人会认为这不是编写可维护代码的方法


至于使用注释-不幸的是,并非所有开发人员都使用相同的IDE,Eclipse用户不会从@Nullable@NotNull注释中受益。如果没有IDE集成,这些将没有太多好处(除了一些额外的文档)。不过我还是推荐这个能力。虽然它只在运行时有用,但它确实有助于找到大多数NPE原因,并且没有性能影响,并且使您的代码所做的假设更加清晰。

如果是我,我会将代码更改为您的后一版本,但我也会添加日志记录(可能是打印)具有类似log4j的框架的语句,因此如果出现问题,我可以检查日志文件以查看空值。

理论上是好的,但实际上几乎不可能。我从未见过一个系统没有代码片段,其中一个对象通过中间对象调用另一个对象的方法。考虑java代码的这行:<代码> MyObj.Sead(AONB.GET())< /C>。在这里,我只对每个对象使用一个点,但如果有NPE,异常不会告诉我什么对象是
null
。我修改了我的示例以更好地解释这种情况,并回应Sean Owen的评论。@Sean Owen:你完全正确,我修改了我的示例,@NotNull注释的自由使用极大地帮助了对此类NPE的推理。我们把@NotNull放在每个地方。实际上,所有内容(RFC2119定义的“必须”)都必须注释为@NotNull或@Nullable,在null是可接受的返回值的例外情况下,必须添加注释,说明为什么可以接受返回null。在这种情况下,当一个NPE显示了一个包含多个可能源的行时,我们可以安全地放弃用@NotNull注释的方法。@NotNull(以及IDE对不完整AST的实时警告)的惊人威力是不可低估的。这就是说,@NotNull/@Nullable支持已经被JetBrains的伟大智囊团在许多、许多、许多个卫星之前纳入IntelliJ IDEA,当这样的NPE出现时,它大大简化了OP所关心的“侦探工作”。维护和可读性是至关重要的。CPU是廉价的,开发人员也很昂贵。继续,让它更具可读性。担心性能,如果它成为和问题的那段代码。
someMap.put(
     someObject.getSomeThing().getSomeOtherThing().getKey(),
     someObject.getSomeThing().getSomeOtherThing())