获得“致命的异常:AsyncTask#2”。我不知道是什么导致了它

时间:2012-02-10 13:27:04

标签: android exception android-asynctask

在尝试调用Web服务并获取相应的json对象时,我遇到了致命的异常。我完全不知道在哪里查看以及要纠正哪些错误。

[Screendump of the exception in question](http://i.imgur.com/EZcbW.png)

编辑:

    private class CallServiceTask extends AsyncTask<Object, Void, JSONObject>
{

    protected JSONObject doInBackground(Object... params) 
    {
        HttpGet req = (HttpGet) params[0];
        String url = (String) params[1];

        return executeRequest(req, url);
    }
}

这是在doInBackground中调用的executeRequest方法:

    private JSONObject executeRequest(HttpGet request, String url)
{
    HttpClient client = new DefaultHttpClient();
    JSONObject jsonObj = null;
    client = getNewHttpClient();

    HttpResponse httpResponse;

    try {
        httpResponse = client.execute(request);

        HttpEntity entity = httpResponse.getEntity();

        if (entity != null) {

            InputStream instream = entity.getContent();
            String response = convertStreamToString(instream);
            try {
                jsonObj = new JSONObject(response);
            } catch (JSONException e1) {
                e1.printStackTrace();
            }

            // Closing the input stream will trigger connection release
            instream.close();
        }

    } catch (ClientProtocolException e)  {
        client.getConnectionManager().shutdown();
        e.printStackTrace();
    } catch (IOException e) {
        client.getConnectionManager().shutdown();
        e.printStackTrace();
    }
    return jsonObj;
}

2 个答案:

答案 0 :(得分:3)

只需查看您的LogCat堆栈跟踪(在本例中),它就会告诉您所有需要知道的异常是什么以及导致它的原因:

  

线程退出未捕获的异常

告诉您已抛出您的代码无法处理的异常

  

执行doInBackground()

时发生错误

这告诉您Async任务中的doInBackground()函数抛出了这个未处理的异常

  

引起:java.lang.ClassCastException ... HttpPost ...(RestClient.java:275)

这告诉您,您遇到了ClassCastException,这是由于该源文件中第275行的HttpPost调用所致。

编辑:

应该更仔细地读取堆栈跟踪...正如HandlerExploit发布的那样,HttpPost正在抛出该错误,你期待HttpGet ......但是下面的调试方法仍然存在:

如果使用e.getMessage()添加额外的catch(ClassCastException e),您很可能会看到更详细地描述问题的有用错误消息。

在这种情况下,我发现一个意外的异常被抛出,我倾向于添加一个临时的'全部捕获'(catch(Exception e){e.printStackTrace()})并在e上添加一个断点。 printStackTrace()所以我可以看到关于异常的所有细节...可能不是最有效的方法,但它是你在黑暗中的开始!

答案 1 :(得分:0)

我最好的猜测是:

HttpGet req = (HttpGet) params[0];

返回HttpPost而不是HttpGet

请发帖到new CallServiceTask().execute();