我一直在尝试使用Asynctask解析XML文件,遵循[1]和[2]教程。我在Activity中实现了一个类,如下所示:
private class GetRoutes extends AsyncTask<String, Void, String[]> {
@Override
protected String[] doInBackground(String... urls) {
String[] read;
try{
RouteReader route = new RouteReader();
read = route.getRoutes();
} catch(IOException iox){
read = new String[1];
read[0] = getResources().getString(R.string.loading_error);
} catch(ArrayIndexOutOfBoundsException aiob){
read = new String[1];
read[0] = getResources().getString(R.string.loading_error);
} catch(NullPointerException npe){
read = new String[1];
read[0] = getResources().getString(R.string.loading_error);
}
return read;
}
@Override
protected void onPostExecute(String[] result) {
values = result;
}
}
然后在我的onCreate方法中调用new GetRoutes().execute("test");
。
但是,当我尝试运行它时,我的应用程序因NullPointerException(logcat is available here)而崩溃。
你能指导我如何解决这个问题吗?
为了进一步参考,我的RouteReader类如下:
public class RouteReader extends Reader{
public final static String routeURL =
"http://webservices.nextbus.com/service/publicXMLFeed?command=routeList&a=ttc";
private Map<String, String> routes;
public RouteReader()
throws IOException, ArrayIndexOutOfBoundsException{
super(new URL(routeURL));
routes = xmlToMap();
}
public String[] getRoutes(){
return (String[]) routes.keySet().toArray();
}
public String getRouteNum(String route){
return routes.get(route);
}
private Map<String, String> xmlToMap()
throws IOException, ArrayIndexOutOfBoundsException{
Map<String, String> data = new HashMap<String, String>();
String input;
do{
input = getReader().readLine();
if (input.startsWith("<route")){
String[] read = input.split("\"");
data.put(read[3], read[1]);
}
}while (!input.equals("</body>"));
return data;
}
}
答案 0 :(得分:1)
我们的日志会在RouteReader第35行显示NumberFormatException。这不是NullPointerException - 它无法将字符串解析为整数,因为字符串是“1S”。您应该弄清楚您想对无效数据做些什么,并对其进行适当处理。
此外,您正在使用==而不是equals来比较字符串,这几乎不是您想要做的。我个人不会尝试使用字符串操作来解析XML:使用XML解析器...这就是它的用途。面对XML格式看似无害的变化,您当前的方法非常脆弱。
答案 1 :(得分:1)
来自您的日志:
Caused by: java.lang.NumberFormatException: Invalid int: "1S"
这可能是由于这一行引起的:
data.put(read[3], Integer.parseInt(read[1]));