空指针问题(策略模式+工厂模式引起的空指针问题)

979 阅读1分钟

1.自动拆箱导致空指针

例如:

Integer a =null;

if(a==1){
}
if(a!=null){
}
  • 所有整型包装类对象之间值的比较,全部使用 equals 方法比较
  • 这里a自动拆箱时就会报空指针,所以这里直接非空判断就可以

2.策略模式+工厂模式简化if-else

  • 在策略实现类中,使用dao层或者其他类中的方法时,@Autowired会Ban注入失败全部报NPR 例如:
@Service
@Slf4j
public class ServiceErrorImpl implements Strategy {
    @Autowired
    private AnalysisService analysisService;
    (analysisService会报NPR)

解决办法:

  • 使用构造方法
 public ServiceErrorImpl(AnalysisService analysisService) {
        this.analysisService = analysisService;
    }

注:使用这种方式如果analysisService类中使用到其它类对象,也会直接报NPR

  • 使用Set方法
public interface Strategy {
    boolean alarmDeal(AlarmLeft alarmLeft, RequestRecord requestRecord, MongoTemplate mongoTemplate);
    void setAnalysisService(AnalysisService analysisService);
}
  • 在调用处传入analysisService对象
  传入策略模式,根据传入的key来决定选择执行哪一个策略
  Strategy strategy = StrategyFactory.creator(alarmIndex);
  strategy.setAnalysisService(analysisService);