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

次のコードを試して、最大要素の1つに空の文字列を入力してください。記述したのと同じエラーが表示されます。とにかく、なぜあなたはバッファを使うのですか?String maxString = new String(ch、start、length)を試してください。

パッケージXmlTest;

javax.xml.parsersをインポートします。; org.xml.saxをインポートします。; importorg.xml.sax.helpers。*;

public class SAXTest {private static final String SPACE = ""; private static final String MAX = "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 に答える