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

Java 如何解决应用程序中的nullpointer异常,让应用程序继续执行任务,而不用使用Spring进行过多的null检查,java,spring,nullpointerexception,Java,Spring,Nullpointerexception,我想知道是否有一种干净的方法来处理映射中的空指针异常,而不需要太多的空检查。对于以下代码,有不同的处理空检查的方法: record.getFoos().forEach(foo -> foo.setBar("Bar!")); //record.getFoos() might be null 选项1: if(record.getFoos() !=null){ } else { // set default value } Optional.ofNullable(record.getFoos

我想知道是否有一种干净的方法来处理映射中的空指针异常,而不需要太多的空检查。对于以下代码,有不同的处理空检查的方法:

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

if(record.getFoos() !=null){
} else {
// set default value
}
Optional.ofNullable(record.getFoos()).ifPresent(foo -> foo.setBar("Bar!")).orElse(new Bar("Default"));
选项2:

if(record.getFoos() !=null){
} else {
// set default value
}
Optional.ofNullable(record.getFoos()).ifPresent(foo -> foo.setBar("Bar!")).orElse(new Bar("Default"));
选项3:

if(record.getFoos() !=null){
} else {
// set default value
}
Optional.ofNullable(record.getFoos()).ifPresent(foo -> foo.setBar("Bar!")).orElse(new Bar("Default"));
在JSON到POJO对象的映射中使用客户反序列化程序,以确保所有必需属性均不为null,并替换为默认值

不要对选项1发表评论,因为当涉及到我们需要编写的代码量时,它是最糟糕的选项

我想您可能会认为选项2没有什么问题,但问题是位置太多,并且确保没有任何强制属性为空。如果您要处理数千个属性和成吨的置换,那么这将不会是真正可伸缩的

选项3似乎也不错,但它会删除错误,并且不可扩展,因为我们需要确保对任何新属性更新反序列化程序,这很容易脱离同步


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

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

  • 正如@chrylis-on-strike所指出的,您应该真正避免使用
    null
    集合在这种情况下,始终使用空集合
  • 也不要在集合中放置
    null
    元素。很少有正当理由诚实地这样做
  • 如果null元素只是临时状态的一部分,则可以轻松筛选null:
  • 可选。ofNullable(…).orElse(…)
    通常是处理某些事情并给出默认值的好方法。您可以轻松地创建一个实用方法来处理该比例。例如

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

  • 正如@chrylis-on-strike所指出的,您应该真正避免使用
    null
    集合在这种情况下,始终使用空集合
  • 也不要在集合中放置
    null
    元素。很少有正当理由诚实地这样做
  • 如果null元素只是临时状态的一部分,则可以轻松筛选null:
  • 可选。ofNullable(…).orElse(…)
    通常是处理某些事情并给出默认值的好方法。您可以轻松地创建一个实用方法来处理该比例。例如

在这种特殊情况下,最干净的方法是。对于Jackson,您只需说
listfoos=newarraylist()记录中
是选项3吗?不是吗?有没有一种方法可以让Jackson批量完成,而不是一个接一个地指定它们?你应该单独完成。当您在其他地方(例如,测试)使用这些DTO时,您希望它们以一致的状态启动。对于Jackson,您只需说
listfoos=newarraylist()记录中
是选项3吗?不是吗?有没有一种方法可以让Jackson批量完成,而不是一个接一个地指定它们?你应该单独完成。当您在其他地方(例如,测试)使用这些DTO时,您希望它们以一致的状态启动。