AsyncTask返回错误

时间:2014-01-01 19:07:45

标签: java android android-asynctask

我一直在尝试使用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;
}

}

2 个答案:

答案 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]));