2016-05-27 119 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。