2012-01-06 2 views
0

Java에서 SAX XML Parser를 쓰려고하는데 해결 방법을 찾을 수없는 널 포인터 예외가 계속 발생합니다. 여기SAX XML Parser throw Null 포인터 예외

Exception in thread "main" java.lang.NullPointerException 
    at SAXParserExample.endElement(SAXParserExample.java:91) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
    at javax.xml.parsers.SAXParser.parse(Unknown Source) 
    at javax.xml.parsers.SAXParser.parse(Unknown Source) 
    at SAXParserExample.parseDocument(SAXParserExample.java:43) 
    at SAXParserExample.runExample(SAXParserExample.java:29) 
    at SAXParserExample.main(SAXParserExample.java:107) 

SAX 파서의 주요 클래스입니다 : 여기

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

import org.xml.sax.SAXException; 

import org.xml.sax.helpers.DefaultHandler; 

public class SAXParserExample extends DefaultHandler{ 

    List<DataRow> myFiles; 

    private String tempVal; 

    //to maintain context 
    private DataRow tempFile; 


    public SAXParserExample(){ 
     myFiles = new ArrayList<DataRow>(); 
    } 

    public void runExample() { 
     parseDocument(); 
     printData(); 
    } 

    private void parseDocument() { 

     //get a factory 
     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     try { 

      //get a new instance of parser 
      SAXParser sp = spf.newSAXParser(); 

      //parse the file and also register this class for call backs 
      sp.parse("./src/filelist.xml", this); 

     }catch(SAXException se) { 
      se.printStackTrace(); 
     }catch(ParserConfigurationException pce) { 
      pce.printStackTrace(); 
     }catch(IOException ie) { 
      ie.printStackTrace(); 
     } 
    } 

    /** 
    * Iterate through the list and print 
    * the contents 
    */ 
    private void printData(){ 

     System.out.println("No of Files '" + myFiles.size() + "'."); 

     Iterator<DataRow> it = myFiles.iterator(); 
     while(it.hasNext()) { 
      System.out.println(it.next().toString()); 
     } 
    } 


    //Event Handlers 
    public void startElement(String uri, String localName, String qName) throws SAXException { 
     //reset 
     tempVal = ""; 
     if(qName.equalsIgnoreCase("DATAROW")) { 
      //create a new instance of Datarow 
      tempFile = new DataRow(); 
     } 
    } 


    public void characters(char[] ch, int start, int length) throws SAXException { 
     tempVal = new String(ch,start,length); 
    } 

    public void endElement(String uri, String localName, String qName) throws SAXException { 

     if(qName.equalsIgnoreCase("DATAROW")) { 
      //add it to the list 
      myFiles.add(tempFile); 

     }else if (qName.equalsIgnoreCase("ID")) { 
      tempFile.setID(Integer.parseInt(tempVal)); 
     }else if (qName.equalsIgnoreCase("FILENAME")) { 
      tempFile.setFileName(tempVal); 
     }else if (qName.equalsIgnoreCase("SEARCHKEY")) { 
      tempFile.setSearchKey(tempVal); 
     }else if (qName.equalsIgnoreCase("DATEADDED")) { 
      tempFile.setDateAdded(tempVal); 
     }else if (qName.equalsIgnoreCase("APPLICATIONID")) { 
      tempFile.setApplicationID(tempVal); 
     }else if (qName.equalsIgnoreCase("DISPLAYFILENAME")) { 
      tempFile.setDisplayFileName(tempVal); 
     } 
    } 

    public static void main(String[] args){ 
     SAXParserExample spe = new SAXParserExample(); 
     spe.runExample(); 
    } 
} 

는 메인 클래스에 사용 된 DataRow 클래스입니다 : 여기

public class DataRow { 

    private String fileName = "", searchKey = "", dateAdded = "", applicationID = "", displayFileName = ""; 

    private int id = 0; 

    public DataRow(){ 

    } 

    public DataRow(int id, String fileName, String searchKey, String dateAdded, String applicationID, String displayFileName) { 
     this.id = id; 
     this.fileName = fileName; 
     this.searchKey = searchKey; 
     this.dateAdded = dateAdded; 
     this.applicationID = applicationID; 
     this.displayFileName = displayFileName; 

    } 
    public String getFileName() { 
     return fileName; 
    } 

    public void setFileName(String fileName) { 
     this.fileName = fileName; 
    } 

    public int getID() { 
     return id; 
    } 

    public void setID(int id) { 
     this.id = id; 
    } 

    public String getSearchKey() { 
     return searchKey; 
    } 

    public void setSearchKey(String searchKey) { 
     this.searchKey = searchKey; 
    } 

    public String getDateAdded() { 
     return dateAdded; 
    } 

    public void setDateAdded(String dateAdded) { 
     this.dateAdded = dateAdded; 
    } 

    public String getApplicationID() { 
     return applicationID; 
    } 

    public void setApplicationID(String applicationID) { 
     this.applicationID = applicationID; 
    } 

    public String getDisplayFileName() { 
     return displayFileName; 
    } 

    public void setDisplayFileName(String displayFileName) { 
     this.displayFileName = displayFileName; 
    } 

    public String toString() { 
     StringBuffer sb = new StringBuffer(); 
     sb.append("File Details - "); 
     sb.append("ID:" + getID()); 
     sb.append(", "); 
     sb.append("Filename:" + getFileName()); 
     sb.append(", "); 
     sb.append("Search Key:" + getSearchKey()); 
     sb.append(", "); 
     sb.append("Date Added:" + getDateAdded()); 
     sb.append(", "); 
     sb.append("Application ID:" + getApplicationID()); 
     sb.append(", "); 
     sb.append("Display Filename:" + getDisplayFileName()); 
     sb.append("."); 

     return sb.toString(); 
    } 
} 

그리고 여기에 스택 추적입니다 구문 분석하려고하는 XML 파일입니다.

<DATAROW><ID>61</ID><FILENAME>TestFile.txt</FILENAME><SEARCHKEY>12345</SEARCHKEY><DATEADDED>2012-1-6 9.12.32.0</DATEADDED><APPLICATIONID>PCIS</APPLICATIONID><DISPLAYFILENAME>TestFile.txt</DISPLAYFILENAME></DATAROW><DATAROW><ID>44</ID><FILENAME>TestFile.txt</FILENAME><SEARCHKEY>12345</SEARCHKEY><DATEADDED>2012-2-5 14.39.50.0</DATEADDED><APPLICATIONID>PCIS</APPLICATIONID><DISPLAYFILENAME>TestFile.txt</DISPLAYFILENAME></DATAROW> 

XML 파일은 최종적으로 단일 문자열 형태로 데이터베이스에서 메타 데이터를 파싱 할 것이므로 형식이 지정됩니다.

+0

어느 하나가 91입니다 잘 작동으로

public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException{...} 

변화를해야 하는가? – Tudor

답변

2

저는 SAX를 오랫동안 사용하지 않았기 때문에 잘못되었을 수도 있습니다.하지만 내 생각에 localName을 사용해야합니다. 여기서 qname은 XML에 'namespace : name'과 같은 일부 네임 스페이스가있는 정규화 된 이름이 없으므로 여기에 있습니다. 따라서 제공된 qname은 대부분 null이며 비교를 위해 액세스하므로 NPE를 얻습니다.

javadoc (http://docs.oracle.com/javase/1.4.2/docs/api/org/xml/sax/helpers/DefaultHandler.html#endElement(java.lang.String)에 따르면, .lang.String, java.lang.String)), 제공된 qname은 XML. 서에서 사용 가능하지 않으면 비어있을 수 있습니다.

4

좋아, 내가 선을 계산 방해 한 91이 라인 :

tempFile.setID(Integer.parseInt(tempVal)); 

그렇게 tempFilenull입니다.

+0

myFiles가 생성자에서 초기화됩니다. –

3

예외로 인해 값이 null 인 변수를 참조 해제하려고 시도하고 있음을 알 수 있습니다. 91 행을보고 null을 확인하는 데 사용되는 모든 변수를 출력 해보십시오. 내 생각 엔 tempFile은 할당 된 적이 없으므로 91 번 줄에 null이 있음을 의미합니다.

0

귀하의 오버라이드 기능

public void startElement(String uri, String localName, String qName) throws SAXException{...} 

다음, 그것은

public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { 
     //reset 
     tempVal = ""; 
     if(qName.equalsIgnoreCase("DATAROW")) { 
      //create a new instance of Datarow 
      tempFile = new DataRow(); 
     } 
    }