2016-05-27 118 views
1

嗨我正在使用HttpServletRequest并试图获取标头集的设置。枚举空指针异常?

下面是代码:

public static Map<String, String> getHeaders(HttpServletRequest request) { 
    Map<String, String> headers = new HashMap<String, String>(); 

    Enumeration<String> headerNames = request.getHeaderNames(); 
    if (headerNames != null) { 
      while (headerNames.hasMoreElements()) { 
       String headerName = headerNames.nextElement(); 
       String header = request.getHeader(headerName); 
       headers.put(headerName, header); 
      } 
     } 
     return headers; 

} 

此方法似乎在headerNames.nextElement被抛出空指针异常()。

有可能hasMoreElements检查返回true,但元素headerNames.nextElement反过来导致空指针异常?

堆栈跟踪:

Stack trace : Caused by: java.lang.NullPointerException at org.apache.tomcat.util.buf.ByteChunk.equalsIgnoreCase(ByteChunk.java:608) at 
org.apache.tomcat.util.buf.MessageBytes.equalsIgnoreCase(MessageBytes.java:325) 
at org.apache.tomcat.util.http.NamesEnumerator.findNext(MimeHeaders.java:414) at org.apache.tomcat.util.http.NamesEnumerator.nextElement(MimeHeaders.java:438) 
at org.apache.tomcat.util.http.NamesEnumerator.nextElement(MimeHeaders.java:396) at generateRequestHeaderMap... 

这将是巨大的,如果你们能帮助我这个问题。

+2

发布堆栈跟踪并准确指出堆栈跟踪中引用的行。 –

+0

堆栈跟踪:引起:java.lang.NullPointerException at org.apache.tomcat。util.buf.ByteChunk.equalsIgnoreCase(ByteChunk.java:608) at org.apache.tomcat.util.buf.MessageBytes.equalsIgnoreCase(MessageBytes.java:325) at org.apache.tomcat.util.http.NamesEnumerator。 findNext(MimeHeaders.java:414) at org.apache.tomcat.util.http.NamesEnumerator.nextElement(MimeHeaders.java:438) at org.apache.tomcat.util.http.NamesEnumerator.nextElement(MimeHeaders.java: 396) at generateRequestHeaderMap ... – CTsiddharth

+0

Tomcat的版本是什么?恰恰。 –

回答

1

我怀疑问题是由一个错位的请求引起的。这里是findNext()在做什么(在Tomcat中6.0.18):

private void findNext() { 
    next=null; 
    for( ; pos< size; pos++) { 
     next=headers.getName(pos).toString(); 
     for(int j=0; j<pos ; j++) { 
      if(headers.getName(j).equalsIgnoreCase(next)) { 
       // duplicate. 
       next=null; 
       break; 
      } 
     } 
     if(next!=null) { 
      // it's not a duplicate 
      break; 
     } 
    } 
    // next time findNext is called it will try the 
    // next element 
    pos++; 
} 

的突出线是这样的:

next=headers.getName(pos).toString(); 

if(headers.getName(j).equalsIgnoreCase(next)) { 

如果标题是错位则有可能为getName(j)返回一个null 。如果发生这种情况,那么equalsIgnoreCase方法的ByteChunk路径将抛出一个NPE。

如果你要科学地跟踪下来,你需要:

请求的实际原始字节
  • 弄个和法医检查它们以确定损坏的性质(如果有的话)
  • 设置了一个测试工具,使您可以使用附加的调试器在此请求上运行您的应用程序....并在源处捕获异常。

非科学方法是将Tomcat升级到最新的补丁版本Tomcat 6 ...或更高版本。它可能会解决这个问题。或不。

下面是早在2010年这个问题在Tomcat的6.0.20另一份报告:

0

这是我如何成功修补的Apache Tomcat到JBoss 6.1.0决赛(在基于在Apache Tomcat 6.0.20源代码部署/ jbossweb.sar/jbossweb.jar):

org.apache.tomcat.util.http.MimeHeaders.NamesEnumerator.findNext()

private void findNext() { 
     next=null; 
     for( ; pos< size; pos++) { 
      // (4 lines changed): check mb for null as suggested here: https://stackoverflow.com/questions/37493552/enumeration-null-pointer-exception/37493888#37493888 
      MessageBytes mb = headers.getName(pos); 
      if (mb != null) { 
       next=mb.toString(); 
      } 
      for(int j=0; j<pos ; j++) { 
       // (2 lines changed): check mb and nex for null as suggested here: https://stackoverflow.com/questions/37493552/enumeration-null-pointer-exception/37493888#37493888 
       mb = headers.getName(j); 
       if(mb != null && next != null && mb.equalsIgnoreCase(next)) { 
        // duplicate. 
        next=null; 
        break; 
       } 
      } 
      // new (just 1 comment line): if mb == null we assume next == null, thus it will be a duplicate (i.e. not found, causing no break) 
      if(next!=null) { 
       // it's not a duplicate 
       break; 
      } 
     } 
     // next time findNext is called it will try the 
     // next element 
     pos++; 
    } 

确定它不能避免在https://mail-archives.apache.org/mod_mbox/tomcat-users/201002.mbox/%[email protected]%3e中提到的非线程安全实现,但至少在读取不必要的头文件期间避免NullPointerException。