FailureAnalyzer 是一种很好的方式在启动时拦截异常并将其转换为易读的消息,并将其包含在 FailureAnalysis 中。 
Spring Boot 为应用程序上下文相关异常、JSR-303 验证等提供了此类分析器。 实际上可以非常容易创建自己的 FailureAnalyzer。
AbstractFailureAnalyzer 是 FailureAnalyzer 的一个抽象实现,它检查要处理的异常中是否存在指定的异常类型。
我们可以从中进行扩展,以便存在指定的异常时有机会去处理。如果由于某种原因无法处理异常,则返回 null 以使另一个实现有机会处理异常。
FailureAnalyzer 实现将在 META-INF/spring.factories 中注册:
# 自己的 FailureAnalyzer org.springframework.boot.diagnostics.FailureAnalyzer=com.example.ProjectConstraintViolationFailureAnalyzer
自定义 FailureAnalyzer,用来检查 java.lang.NullPointerException 异常,输出易读的消息。
(1)继承 AbstractFailureAnalyzer,重写 analyze 方法,返回 FailureAnalysis。代码如下:
import org.springframework.boot.diagnostics.AbstractFailureAnalyzer;
import org.springframework.boot.diagnostics.FailureAnalysis;
public class MyFailureAnalyzer extends AbstractFailureAnalyzer<NullPointerException> {
    @Override
    protected FailureAnalysis analyze(Throwable rootFailure, NullPointerException cause) {
        return new FailureAnalysis(cause.getMessage(), "空指针异常,请仔细检查", cause);
    }
}(2)在 src/main/resources/META-INF 目录中添加 spring.factories,并注册自定义的 FailureAnalyzer:
# 注册自定义的FailureAnalyzer org.springframework.boot.diagnostics.FailureAnalyzer=com.huangx.springboot.springapplication.MyFailureAnalyzer
(3)创建一个 Bean,在 Bean 的默认构造方法中模拟一个 NullPointerException 异常。SpringBoot 在启动时会采用默认构造方法创建这个 bean,默认构造方法会抛出 java.lang.NullPointerException 运行时异常,此时可通过自定义的 FailureAnalyzer 进行捕获并处理该异常。代码如下:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.text.SimpleDateFormat;
import java.util.Date;
@RestController
public class IndexController {
    public IndexController() {
        System.out.println("Init IndexController");
        SimpleDateFormat simpleDateFormat = null;
        if(System.currentTimeMillis() % 100 == 0) {
            simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        }
        System.out.println("DATE::" + simpleDateFormat.format(new Date()));
    }
    @RequestMapping("/")
    public String index() {
        return "Spring Boot SpringApplication";
    }
}上面代码中,simpleDateFormat.format(new Date())) 代码可能会抛出 NullPointerException 异常。
(4)启动 Spring Boot 程序,错误信息输出如下:

