title: SAX XML Parser throwing Null Pointer Exception
body: <p>I'm trying to write an SAX XML Parser in Java and I keep getting a null pointer exception that I can't seem to figure out how to fix. Here is the stack trace:</p>
  
  <pre><code>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)
  </code></pre>
  
  <p>Here is the main class for the SAX Parser:</p>
  
  <pre><code>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&lt;DataRow&gt; myFiles;
  
      private String tempVal;
  
      //to maintain context
      private DataRow tempFile;
  
  
      public SAXParserExample(){
          myFiles = new ArrayList&lt;DataRow&gt;();
      }
  
      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&lt;DataRow&gt; 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();
      }
  }
  </code></pre>
  
  <p>Here is the DataRow class used in the main class:</p>
  
  <pre><code>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();
      }
  }
  </code></pre>
  
  <p>And here is the XML file I'm attempting to parse:</p>
  
  <pre><code>&lt;DATAROW&gt;&lt;ID&gt;61&lt;/ID&gt;&lt;FILENAME&gt;TestFile.txt&lt;/FILENAME&gt;&lt;SEARCHKEY&gt;12345&lt;/SEARCHKEY&gt;&lt;DATEADDED&gt;2012-1-6 9.12.32.0&lt;/DATEADDED&gt;&lt;APPLICATIONID&gt;PCIS&lt;/APPLICATIONID&gt;&lt;DISPLAYFILENAME&gt;TestFile.txt&lt;/DISPLAYFILENAME&gt;&lt;/DATAROW&gt;&lt;DATAROW&gt;&lt;ID&gt;44&lt;/ID&gt;&lt;FILENAME&gt;TestFile.txt&lt;/FILENAME&gt;&lt;SEARCHKEY&gt;12345&lt;/SEARCHKEY&gt;&lt;DATEADDED&gt;2012-2-5 14.39.50.0&lt;/DATEADDED&gt;&lt;APPLICATIONID&gt;PCIS&lt;/APPLICATIONID&gt;&lt;DISPLAYFILENAME&gt;TestFile.txt&lt;/DISPLAYFILENAME&gt;&lt;/DATAROW&gt;
  </code></pre>
  
  <p>The XML file is formatted that way because eventually it's going to be parsing metadata return from a database in the form of a single string.</p>