0

首先,这是困扰我的 XML 文件的一个片段。完整的 XML 文件非常大,包含许多名称不同的“包”。

<repo version="2">
    <package name="packageNameHere">
        <author>Some Author</author>
        <version>0.1</version>
        <description>A description</description>
        <dependencies/>
        <API>
            <max>0.1</max>
            <min>0.1</min>
        </API>
        <download>
            http://www.somedownload.com/downloadfile.jar
        </download>
    </package>
</repo>

该程序对 XML 文件进行初始扫描,并获取所有包名称的列表。然后要求用户输入包名称。这DefaultHandler用于查找有关该软件包的信息。

private String packageToFind = null, currentElement = "";
public Package locatedPack = null;
private boolean finished = false;
private StringBuffer buffer = new StringBuffer();

public PackageSearchingRepoXMLHandler(String PackageToFind) {
    this.packageToFind = PackageToFind;
}

@Override
public void startElement(String uri, String localName, String elementName, Attributes attributes) throws SAXException {
    if(!finished && elementName.equals("package") && attributes.getValue("name").equals(packageToFind))
        locatedPack = new Package(packageToFind);
    else if(locatedPack != null && !finished) {
        currentElement = elementName;
    }
}

@Override
public void endElement(String uri, String localName, String elementName) throws SAXException {
    if(locatedPack != null && !finished) {
        switch(currentElement) {
        case "author":
            locatedPack.setAuthor(buffer.toString());
            buffer = new StringBuffer();
            break;
        case "version":
            locatedPack.setVersion(Double.parseDouble(buffer.toString()));
            buffer = new StringBuffer();
            break;
        case "description":
            locatedPack.setDescription(buffer.toString());
            buffer = new StringBuffer();
            break;
        case "dependencies":
            locatedPack.setDependencies(buffer.toString().split(", "));
            buffer = new StringBuffer();
            break;
        case "max":
            locatedPack.setApiMAX(Double.parseDouble(buffer.toString()));
            buffer = new StringBuffer();
            break;
        case "min":
            locatedPack.setApiMIN(Double.parseDouble(buffer.toString())); //This is line 157
            buffer = new StringBuffer();
            break;
        case "download":
            try {
                locatedPack.setDownloadLink(new URL(buffer.toString()));
            } catch (MalformedURLException e) {/* Won't happen */}
            buffer = new StringBuffer();
            break;
        case "package":
            finished = true;
        default:
            break;
        }
    }
}

@Override
public void characters(char[] ch, int start, int length) {
    if (!finished)
        buffer.append(new String(ch, start, length));
}

ANumberFormatException正在从Double.parseDouble()零件中抛出;原因有点是empty String。我不能给你一个具体的行号,因为控制台没有给我一个。

任何人都知道导致我的程序无法正确输出数据的这个恼人错误的原因吗?困扰我很久了!:@

编辑
这是确切的堆栈跟踪(更多的是,我删除了所有的摇摆废话......):

java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
at java.lang.Double.parseDouble(Unknown Source)
at [removed class/package info].endElement(PackageHelper.java:157)

第 157 行在代码中突出显示。

4

1 回答 1

0

请尝试以下代码并在最大元素之一中输入空字符串,出现与您编写的相同的错误。无论如何,您为什么要使用缓冲区?试试 String maxString = new String(ch, start, length)。

包 XmlTest;

导入 javax.xml.parsers。; 导入 org.xml.sax。; 导入 org.xml.sax.helpers.*;

公共类 SAXTest { private static final String SPACE = " "; 私人静态最终字符串MAX =“最大”;

public static void main(String[] args) throws Exception {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();

    DefaultHandler handler = new DefaultHandler() {
        boolean maxElement = false;

        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {

            if (qName.equalsIgnoreCase(MAX)) {
                maxElement = true;
            }

        }

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

        public void characters(char ch[], int start, int length) throws SAXException {

            if (maxElement) {
                String maxString = new String(ch, start, length);
                Double maxDouble = Double.parseDouble(maxString);
                System.out.println(MAX + SPACE + maxDouble);
                maxElement = false;
            }
        }
    };

    saxParser.parse("your_xml_file.xml", handler);
}

}

于 2013-02-22T20:50:04.997 回答