Java 尽管请求不是null,但request.getCookies()会抛出NullPointerException
我有以下Java 尽管请求不是null,但request.getCookies()会抛出NullPointerException,java,tomcat,servlets,nullpointerexception,session-cookies,Java,Tomcat,Servlets,Nullpointerexception,Session Cookies,我有以下实用程序函数从cookie中获取值: public static long getClientTimezoneOffset(HttpServletRequest request) { long timeZoneOffset = 0; if(request != null) { Cookie[] cookies = request.getCookies(); // throws null pointer execep
实用程序
函数从cookie
中获取值:
public static long getClientTimezoneOffset(HttpServletRequest request)
{
long timeZoneOffset = 0;
if(request != null)
{
Cookie[] cookies = request.getCookies(); // throws null pointer exeception from here
if(cookies != null)
{
for(Cookie cookie : cookies)
{
if(cookie.getName().equals("timezoneOffset"))
{
try
{
timeZoneOffset = Long.parseLong(cookie.getValue());
}
catch (Exception ex)
{
ex.printStackTrace();
}
break;
}
}
}
}
return timeZoneOffset;
}
我已经检查了请求
对象,它不是NULL
。它并不总是抛出异常,但有时会抛出异常。这就是为什么很难找出实际问题的原因
我已经检查过类似的帖子,但都没有帮助。非常感谢您的帮助。看起来这在8.029版中已修复。请参见此错误: 您的Tomcat版本已经很旧了,可能是时候更新了。如果不可能,请在调用
request.getCookies()
之前检查request.getContext()==null
。可能只有在主机映射过程中出现问题时才会发生这种情况,但如果没有更多信息,我无法告诉您确切的原因。通过一些额外的日志记录,您可以比较一个好请求和一个坏请求的详细信息,并查看差异所在
编辑:
升级到
tomcat 8.0.36
解决了这个问题。“它并不总是抛出异常,但有时”对我来说听起来很奇怪。NPE有什么消息吗?对不起。这个缩写词是什么意思@AndrewTobilkoI已经发布了完整stacktrace的一部分。我应该发布完整内容吗?我认为,在这种情况下,您需要这几乎肯定是应用程序存储对HttpServletRequest的引用的时间超过请求有效时间的问题。我建议您(a)升级到8.0.0最新版本,并(b)修复您的应用程序。也会遇到相同的异常java.lang.NullPointerException(请求)使用((请求)请求)。getContext()
相反,它不能NPE。没有这样的函数Request.getContext()
。当我键入该request.getContextPath()
时会出现。顺便说一下,我已经升级到了tomcat 8.0.36,无法重现这个问题。在确认问题已经解决后,我会通知您。顺便说一下,我在这个版本的tomcat中也遇到了这个问题apache-tomcat-7.0.68
@Markolsson这就是为什么强制转换为Request-((Request)Request).getContext()
。HttpServletRequest中没有getContext(),因为您只看到接口方法。如果您将请求
(小写r)强制转换为请求
对象(至少在Tomcat中是这样),则可以访问其他方法,如getContext()。但所有这些都是没有意义的,因为更新修复了问题,而且你也不需要这样做。
java.lang.NullPointerException
at org.apache.catalina.connector.Request.parseCookies(Request.java:2943)
at org.apache.catalina.connector.Request.convertCookies(Request.java:2958)
at org.apache.catalina.connector.Request.getCookies(Request.java:1987)
at org.apache.catalina.connector.RequestFacade.getCookies(RequestFacade.java:662)
at javax.servlet.http.HttpServletRequestWrapper.getCookies(HttpServletRequestWrapper.java:69)
at javax.servlet.http.HttpServletRequestWrapper.getCookies(HttpServletRequestWrapper.java:69)
at javax.servlet.http.HttpServletRequestWrapper.getCookies(HttpServletRequestWrapper.java:69)
at javax.servlet.http.HttpServletRequestWrapper.getCookies(HttpServletRequestWrapper.java:69)