致命异常:AsyncTask #1,java.lang.RuntimeException:执行 doInBackground() 时发生错误

Posted

技术标签:

【中文标题】致命异常:AsyncTask #1,java.lang.RuntimeException:执行 doInBackground() 时发生错误【英文标题】:FATAL EXCEPTION: AsyncTask #1, java.lang.RuntimeException: An error occured while executing doInBackground() 【发布时间】:2013-06-01 08:22:22 【问题描述】:

我想从 web 服务中获取 json 对象并将它们显示在列表视图中,

这是我的代码:

public class MainActivity extends Activity 

    private JsonObject data = null;
    private JsonObject response = null;
    private JsonArray records = null;
    private JsonObject record = null;
    private ArrayList<SearchResults> results = null;
    SearchResults sr1 = null;

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ArrayList<SearchResults> searchResults = GetSearchResults();

        final ListView lv1 = (ListView) findViewById(R.id.ListView01);
        lv1.setAdapter(new MyCustomBaseAdapter(this, searchResults));
    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    

    private ArrayList<SearchResults> GetSearchResults() 
        results = new ArrayList<SearchResults>();       
        new GetResults().execute("");

        return results;
    

    private class GetResults extends AsyncTask<String, Void, String> 

        @Override
        protected String doInBackground(String... params) 

            Map<String, String> callArgs = new HashMap<String, String>(1);

            callArgs.put("suuid", "dtr0bdQGcqwSh3QO7fVwgVfBNWog6mvEbAyljlLX9E642Yfmur");

            try 
                response = EventPulseCloud.call("ListEvents", callArgs);
             catch (HttpClientException e) 
                e.printStackTrace();
             catch (IOException e) 
                e.printStackTrace();
             catch (JsonException e) 
                e.printStackTrace();
            

            return response.get("Type").toString();
        

        protected void onPostExecute(String result) 

            if(result.equals("success")) 

                data = (JsonObject) response.get("Data");
                records = (JsonArray) data.get("Records");

                try 
                    records = response.getObject ("Data").getArray ("Records");
                 catch (JsonException e) 
                    e.printStackTrace();
                

                for(int i = 0; i < records.count(); i ++) 
                    record = (JsonObject) records.get(i);

                    sr1 = new SearchResults();
                    sr1.setAddress(record.get("address").toString());
                    sr1.setStartingDate(record.get("StartingDate").toString());
                    sr1.setTicketCategories(record.get("ticketCategories").toString());
                results.add(sr1);

                

            
        

    


我在 logcat 中得到了这个:

06-05 15:53:39.765: E/androidRuntime(10012): FATAL EXCEPTION: AsyncTask #1
06-05 15:53:39.765: E/AndroidRuntime(10012): java.lang.RuntimeException: An error occured while executing doInBackground()
06-05 15:53:39.765: E/AndroidRuntime(10012):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
06-05 15:53:39.765: E/AndroidRuntime(10012):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
06-05 15:53:39.765: E/AndroidRuntime(10012):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
06-05 15:53:39.765: E/AndroidRuntime(10012):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
06-05 15:53:39.765: E/AndroidRuntime(10012):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
06-05 15:53:39.765: E/AndroidRuntime(10012):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
06-05 15:53:39.765: E/AndroidRuntime(10012):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
06-05 15:53:39.765: E/AndroidRuntime(10012):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
06-05 15:53:39.765: E/AndroidRuntime(10012):    at java.lang.Thread.run(Thread.java:856)
06-05 15:53:39.765: E/AndroidRuntime(10012): Caused by: java.lang.NullPointerException
06-05 15:53:39.765: E/AndroidRuntime(10012):    at com.example.listview.MainActivity$GetResults.doInBackground(MainActivity.java:73)
06-05 15:53:39.765: E/AndroidRuntime(10012):    at com.example.listview.MainActivity$GetResults.doInBackground(MainActivity.java:1)
06-05 15:53:39.765: E/AndroidRuntime(10012):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
06-05 15:53:39.765: E/AndroidRuntime(10012):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
06-05 15:53:39.765: E/AndroidRuntime(10012):    ... 5 more
06-05 15:53:40.050: I/Process(10012): Sending signal. PID: 10012 SIG: 9

在logcat中,MainActivity.java:73这一行是:

return response.get("Type").toString();

对我来说一切似乎都是正确的...请问您对此有任何想法吗?谢谢你:)

编辑: 当我在 java 中尝试这段代码时:

Map<String, String> callArgs = new HashMap<String, String>(1);
    callArgs.put("suuid", "dtr0bdQGcqwSh3QO7fVwgVfBNWog6mvEbAyljlLX9E642Yfmur");
    response = EventPulseCloud.call("ListEvents", callArgs);

    if(response.get("Type").equals("success")) 
         JsonArray records = response.getObject ("Data").getArray ("Records");
         for (int i = 0; i < records.count (); i++) 
              JsonObject record = (JsonObject)records.get (i);
              System.out.print(record.get("ticketCategories").toString());
         
    
    else
        System.out.println("No");

它会显示在屏幕上:

[“单日”] [“单日”] [“普通票”]

它确实意味着它返回了一些东西。

【问题讨论】:

responsenull 所以这条线response = EventPulseCloud.call("ListEvents", callArgs); 可能返回null。我会检查是否是这种情况 【参考方案1】:

我猜response.get("Type") 的结果为空。在尝试使用它之前,您应该真正检查它的返回。

【讨论】:

response 本身是 null 或者我相信 onPostExecute() 会出现异常 谢谢 :) 我在问题中添加了一个规范,您可以检查我的编辑吗?【参考方案2】:

response.get("Type") 正在返回 null。确保您正在寻找正确的东西(可能是“类型”而不是“类型”?),如果没有其他问题,请添加一些空值检查。

Object typeObj = response.get("Type");
if (typeObj != null) 
    return typeObj.toString();

return null;

【讨论】:

response 也可以为空。 在不知道您正在调用什么 Web 服务或响应应该是什么样子的情况下,对我们任何人来说唯一可辨别的是您有一个 NullPointerException,当您尝试访问成员变量时会发生这种情况或在未初始化的对象上调用方法。剩下的就看你自己了。 对不起,这是一个小问题,我已经解决了,现在可以了,但我遇到了另一个问题:***.com/questions/16948937/… 你能检查一下吗?【参考方案3】:

可能缺少访问互联网的权限请求。避免它。在 Android Manifest 文件中添加

<uses-permission android:name="android.permission.INTERNET" />

【讨论】:

以上是关于致命异常:AsyncTask #1,java.lang.RuntimeException:执行 doInBackground() 时发生错误的主要内容,如果未能解决你的问题,请参考以下文章

E/AndroidRuntime:致命异常:Android 的 AsyncTask #1 错误

获得致命异常:使用 Async 类的 AsyncTask #1

致命异常:AsyncTask #1,java.lang.RuntimeException:执行 doInBackground() 时发生错误

致命异常:AsyncTask #1 java.lang.RuntimeException:执行 doInBackground() 时发生错误

到 phpmyadmin 的致命异常 AsyncTask 连接

E / AndroidRuntime:致命异常:Android的AsyncTask#1 ERROR