web项目使用偶尔会出现空指针错误,页面白屏打不开

2018-05-31 10:44:13,862 [ERROR] [HTTP-81-exec-12] ActionHandler.handle - / com.jfinal.render.RenderException: java.lang.NullPointerException at com.jfinal.render.VelocityRender.render(VelocityRender.java:132) at com.jfinal.core.ActionHandler.handle(ActionHandler.java:97) at com.jfinal.ext.handler.ContextPathHandler.handle(ContextPathHandler.java:47) at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:506) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.NullPointerException at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1533) at org.apache.velocity.runtime.RuntimeInstance.getTemplate(RuntimeInstance.java:1514) at org.apache.velocity.runtime.RuntimeSingleton.getTemplate(RuntimeSingleton.java:299) at org.apache.velocity.app.Velocity.getTemplate(Velocity.java:358) at com.jfinal.render.VelocityRender.render(VelocityRender.java:112) ... 19 more


请问一般是什么原因会导致

评论区

杜福忠

2018-05-31 11:36

https://www.baidu.com/s?ie=UTF-8&wd=eclipse%20debug

debug

信阳

2018-05-31 11:40

@杜福忠 本地没有发生过,发布的会突发性的一直报这个错

杜福忠

2018-05-31 11:47

@信阳 jfinal版本是 ? 反馈时一定要尽量描述清楚, 《提问的智慧》如何向社区提问题 - 分享

信阳

2018-05-31 11:56

@杜福忠 jfinal版本是2.2,项目发布后一开始正常,但是过段时间就会偶发性的一直报上面这个错误,页面空白,上次还遇到一种情况是,发生这个错误后突然间又好了,是发布在LINUX系统上的,不过我最近加了个session拦截器(SessionInViewInterceptor),不知道是不是它影响到了?

JFinal

2018-05-31 12:40

@信阳 NPE 只能老老实实单步调试,找到为 null 的对象,解决掉即可

目测你这个是 VelocityRender 中在 getTemplate 时返回了 null, 从而在调用 null.render() 方法时出错,因为 null 对象是不能调用其 render() 方法的 : null.render()

信阳

2018-05-31 17:34

@JFinal 有点尴尬,只在线上偶尔爆发式的出现这个空指针,最近比较频繁,要重启才好,本地从未出现过这个问题,不知道该怎么着手

JFinal

2018-05-31 22:15

@信阳 做个 MyVelocityRender 扩展一下 VelocityRender,然后覆盖父类的 render() 方法,将 VelocityRender 的所有代码 copy 到这个 render() 方法中

在这个 render 方法中添加一个 try catch,对所有异常做个明确的日志,看看 getTemplate(view) 是在 view 值是什么的时候出现的 null pointer 异常就能清楚地定位了

然后再做个 MyRenderFactory 以便切换到自己 MyVelocityRender:
public MyRenderFactory extends RenderFactory {
public Render getVeloictyRender(String view) {
return new MyVelocityRender(view));
}
}

最后配置一下即可:
public void configConstant(Constants me) {
me.setRenderFactory(new MyRenderFactory());
}

热门反馈

扫码入社