まず、私を悩ませている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行目はコードで強調表示されています。