在Android中设置一个字符串,记录字符串,Null指针

时间:2014-01-16 05:39:03

标签: java android nullpointerexception

我有一个成员变量:String message = null;

这是一个包含两个Log.d()语句的异步任务。

private class LoadFromWeb extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        Ion.with(MyActivity.this,
                "http://example.com/api/?post=1_15_2014&json=1")
                .asJsonObject()
                .setCallback(new FutureCallback<JsonObject>() {
                    @Override
                    public void onCompleted(Exception e, JsonObject result) {
                        if (result == null) {
                            return;
                        }

                        JsonObject jsonCustomFields = result
                                .getAsJsonObject("post").getAsJsonObject(
                                        "custom_fields");

                        String jsonMessage = jsonCustomFields
                                .getAsJsonArray("message").get(0)
                                .toString();


                        message = jsonMessage;
                                Log.d("me", message); //Output: "Hello World"


                    }
                });
        return null;
    }

    @Override
    public void onPostExecute(Void arg0) {
        Log.d("me", message); //NULL POINTER EXCEPTION

    }
    }

我不知道为什么会这样做,而且我没有在其他任何地方触及成员变量。我没有想法。

确切的错误是:

01-16 00:31:25.360: E/AndroidRuntime(17807): java.lang.NullPointerException: println needs a message

更新

public class MyActivity extends SherlockListActivity {

    SharedPreferences prefs;
    private DatabaseHelper db = null;
    TextView myView;
    String message = null;

5 个答案:

答案 0 :(得分:1)

ION本身就是一个异步网络库。在Ion中拨打Asynctask表示您正在Asynctask内拨打另一个Asynctask。那就是问题所在。如果您在Log.d("me", message);方法的return null;行之前使用doInBackground,那么您也会获得NPE。

不要将Asynctask与Ion一起使用。使用以下代码将完成您所需的一切

Ion.with(MyActivity.this,
                "http://example.com/api/?post=1_15_2014&json=1")
                .asJsonObject()
                .setCallback(new FutureCallback<JsonObject>() {
                    @Override
                    public void onCompleted(Exception e, JsonObject result) {
                        if (result == null) {
                            return;
                        }

                        JsonObject jsonCustomFields = result
                                .getAsJsonObject("post").getAsJsonObject(
                                        "custom_fields");

                        String jsonMessage = jsonCustomFields
                                .getAsJsonArray("message").get(0)
                                .toString();


                        message = jsonMessage;
                                Log.d("me", message); //Output: "Hello World"


                    }
                });
Ion中的

onCompletedonPostExecute

Asynctask相同

答案 1 :(得分:1)

您正在doInBackground方法中创建另一个异步任务。所以流程就是这样:doInBackground被调用,在其中用ION.with创建一个新的异步任务(但不一定在那一刻执行),doInBackground返回null。因此,内部异步任务中的代码可以在其他所有内容之后执行。

答案 2 :(得分:0)

当你使用日志时,请按照这样定义,你永远不会得到nullpointerexception

Log.e("me", "is:"+message);

答案 3 :(得分:0)

试试这个

Log.d("me", "value : " +message); 

即使值null也显示日志。它不会导致NPE

答案 4 :(得分:0)

字符串消息在此行中设置

message = jsonMessage;

但在此之前消息为null。因此,如果以下行中的resultnull

if (result == null) {
    return;
}

然后它被退回。因此,onPostexecute消息为null,从而获得异常。