如何通过让应用程序继续执行任务来解决应用程序中的nullpointer异常,而不需要使用Spring进行过多的null检



我想知道是否有一种干净的方法可以在不进行过多空检查的情况下处理映射中的空指针异常。对于以下代码,有不同的方式来处理空检查:

record.getFoos().forEach(foo -> foo.setBar("Bar!")); //record.getFoos() might be null

选项1:

if(record.getFoos() !=null){
} else {
// set default value
}

选项2:

Optional.ofNullable(record.getFoos()).ifPresent(foo -> foo.setBar("Bar!")).orElse(new Bar("Default"));

选项3:

在JSON到POJO对象的映射处使用客户反序列化程序,以确保没有任何强制属性为null并替换为默认值。

对于选项1没有任何评论,因为就我们需要编写的代码量而言,它是最糟糕的选项。

我想你可能认为选项2没有错,但问题是会有太多的地方,并且确保没有一个强制性属性为空。如果你要处理成千上万的属性和大量的排列,这将不是真正的可扩展性。

选项3似乎也很好,但它会被错误修剪,并且不可扩展,因为我们需要确保对任何新属性都会更新反序列化程序,这很容易失去同步。

我想知道Spring框架是否有另一种方法,我们可以以某种方式定义一种方法:每当在某个包中抛出空指针异常时,不退出该方法,而是继续工作并为相应的对象使用默认值?在这种情况下,我们只需要说Bar的默认值是"Default"

我认为值得一提的是一些通常用于避免此类问题的最佳实践:

  • 正如@chrylis-on-strike-所指出的,您应该真正避免使用null集合在这种情况下,始终使用空集合
  • 不要将null元素也放在集合中。很少有正当理由诚实地这么做
  • 如果null元素只是临时状态的一部分,则可以轻松筛选null:
record.getFoos().stream()
.filter(Objects::nonNull)
.forEach(it -> . . .)
  • Optional.ofNullable(. . .).orElse(. . .)通常是处理某些事情并给出默认值的好方法。您可以很容易地创建一个实用程序方法来处理比例中的问题。例如
public static  <T> T defaultIfNull(T nullable, T defaultVal) {
return Optional.ofNullable(nullable).orElse(defaultVal);
}
  • 你永远不应该试图抓住NullPointerException并试图处理它。这是一条通往地狱的湿滑道路:(
  • 如果反序列化可为null的实体,并且默认值具有以下代码:
public class JavaObject 
{
@JsonProperty("some-value")
public String someValue = "default-value"; // set default value
@JsonSetter("some-value")
public void setSomeValue(String s) {
if (s != null) { // check for null assingment
someValue = s; 
}
}

最新更新