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)