【问题标题】:Null pointer Exception in asynctask异步任务中的空指针异常
【发布时间】:2011-12-10 06:05:48
【问题描述】:

请帮助我为什么会收到此错误。 我正在使用 convertStreamToString 方法将 Json 响应转换为字符串,得到正确的字符串,我可以在我的 logcat 中看到这个字符串。
现在我正在尝试将我的 json 响应字符串插入到 sqlite 数据库中,因为我正在使用

JSONObject HabitatObject = MyHabitatJsonObject.getJSONObject("HabitatDetails");    
JSONObject HabitatPosts = HabitatObject.getJSONObject("habitat");
    JSONArray HabitatPostsArray = HabitatPosts.getJSONArray("Post");
        ContentValues values = new ContentValues();
         DatabaseHelper InsertHabitat;     
        for (int i = 0; i < HabitatPostsArray.length(); i++) {
         values.put(InsertHabitat.PostUserImage, HabitatPostsArray.getJSONObject(i).getString("userimage").toString());
         values.put(InsertHabitat.PostUserName, HabitatPostsArray.getJSONObject(i).getString("username").toString());
    dbHabitat.insert(InsertHabitat.HABITATTABLE, null, values);
                }

到目前为止,一切都很好,但是当我尝试将这些值插入数据库时​​,我在这一行出现错误
values.put(InsertHabitat.PostUserImage, HabitatPostsArray.getJSONObject(i).getString("userpostimage").toString());

错误日志:

12-10 10:57:19.872: E/AndroidRuntime(301): FATAL EXCEPTION: AsyncTask #3
12-10 10:57:19.872: E/AndroidRuntime(301): java.lang.RuntimeException: An error occured while executing doInBackground()
12-10 10:57:19.872: E/AndroidRuntime(301):  at android.os.AsyncTask$3.done(AsyncTask.java:200)
12-10 10:57:19.872: E/AndroidRuntime(301):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
12-10 10:57:19.872: E/AndroidRuntime(301):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
12-10 10:57:19.872: E/AndroidRuntime(301):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
12-10 10:57:19.872: E/AndroidRuntime(301):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-10 10:57:19.872: E/AndroidRuntime(301):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
12-10 10:57:19.872: E/AndroidRuntime(301):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
12-10 10:57:19.872: E/AndroidRuntime(301):  at java.lang.Thread.run(Thread.java:1096)
12-10 10:57:19.872: E/AndroidRuntime(301): Caused by: java.lang.NullPointerException
12-10 10:57:19.872: E/AndroidRuntime(301):  at com.UserLogin.Habitat$HabitatResults.doInBackground(Habitat.java:90)
12-10 10:57:19.872: E/AndroidRuntime(301):  at com.UserLogin.Habitat$HabitatResults.doInBackground(Habitat.java:1)
12-10 10:57:19.872: E/AndroidRuntime(301):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
12-10 10:57:19.872: E/AndroidRuntime(301):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-10 10:57:19.872: E/AndroidRuntime(301):  ... 4 more

【问题讨论】:

    标签: android json nullpointerexception android-asynctask null-pointer


    【解决方案1】:

    我认为这是空的

    HabitatPostsArray.getJSONObject(i).getString("userpostimage")
    

    您是否尝试过打印该值?检查该行之前的值,基本检查如下:

    JSONObject jo = HabitatPostsArray.getJSONObject(i);
    
    if (jo == null)
        Log.d("tag", "json obj null "+i);
    if (!jo.has("userpostimage"))
        Log.d("tag", "key not present, you are not parsing correctly the json");
    
    String s = jo.getString("userpostimage");
    if (s == null)
        Log.d("tag", "userpostimage null");
    

    【讨论】:

    • 是的..它正在打印日志中的值..这个值不会为空
    • 在 2 种情况下,您可以在该行上有一个空指针:json 对象为空或键“userpostimage”没有值...
    • 他们如何克服请帮忙。我可以在日志中看到 json 响应字符串。并能够打印 json 数组的值。这是我的json响应字符串{“HabitatDetails”:{“action”:“success”,“habitat”:{“Post”:[{“userpostimage”:“website.com/images/1104951994.jpg”,“userid”:“50”, username": "Mike","info": "samplelink.com","date": "Dec 08,2011","cmets": "0"},{"userpostimage": "website.com/images/164003794.jpg", "userid": "193 ","username": "ajith","info": "这是示例文本信息","date": "Dec 07,2011","cmets": "0"}]}}}
    • @user1090892 - 尝试检查该行之前的所有值。我在上面的答案中添加了一些东西......希望它会有所帮助
    • 上述条件失败 jo 不为空,jo 有 userpostimage 且 s 不为空... :(
    【解决方案2】:

    尝试记录你的 JsonObject [jo],你在那里得到了值吗? JSONObject jo = HabitatPostsArray.getJSONObject(i);

    if (jo == null)
        Log.d("tag", "json obj null "+i);
    else 
        Log.d("tag", "json object at index" + i + " is : " + jo.toString());
    

    【讨论】:

    • 是的,它正在那里打印值.. jsonobject 的所有值都出现在这段代码 values.put(InsertHabitat.PostUserImage, HabitatPostsArray.getJSONObject(i).getString("userimage"). toString());这里 PostUserImage 是字符串类型,我们正在将 json 结果转换为字符串。 json 结果的值正在打印,但在这一行中出现错误。值是内容值。
    • 感谢您的回复 shraddha.. 得到解决方案
    • 太棒了!任何时候的朋友。出了什么问题?请发布解决方案,以便它也可以帮助其他人。
    猜你喜欢
    • 2011-09-24
    • 1970-01-01
    • 2013-08-26
    • 2014-09-02
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多