gpt4 book ai didi

java - SAX XML 解析器抛出空指针异常

转载 作者:行者123 更新时间:2023-12-01 06:57:13 26 4
gpt4 key购买 nike

我正在尝试用 Java 编写 SAX XML 解析器,但我不断收到空指针异常,我似乎不知道如何修复。这是堆栈跟踪:

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 文件采用这种方式格式化,因为最终它将解析从数据库以单个字符串形式返回的元数据。

最佳答案

好吧,我费心数了一下行数,91 就是这一行:

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

所以tempFilenull

关于java - SAX XML 解析器抛出空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8761121/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com