Java 在Android中设置字符串,记录字符串,空指针

Java 在Android中设置字符串,记录字符串,空指针,java,android,nullpointerexception,Java,Android,Nullpointerexception,我有一个成员变量:stringmessage=null 这是一个包含两条Log.d()语句的异步任务 private class LoadFromWeb extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { Ion.with(MyActivity.this, "http://exam

我有一个成员变量:
stringmessage=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

    }
    }
更新:

public class MyActivity extends SherlockListActivity {

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

当您使用日志时,请这样定义,您将永远不会得到nullpointerexception

Log.e("me", "is:"+message);
像这样试试

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

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

字符串消息设置在此行中

message = jsonMessage;
但在此之前,消息为
null
。因此,如果下一行中的
结果
null

if (result == null) {
    return;
}
然后它被返回。因此,在onPostexecute中,消息为null,从而获得异常。

本身就是一个异步网络库。在
Asynctask
中调用
Ion
表示您正在
Asynctask
中调用另一个
Asynctask
。这就是问题所在。如果您使用
Log.d(“我”,消息)前的code>返回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.with(MyActivity.this,
"http://example.com/api/?post=1_15_2014&json=1")
.asJsonObject()
.setCallback(新的FutureCallback(){
@凌驾
未完成公共无效(异常e,JsonObject结果){
如果(结果==null){
返回;
}
JsonObject jsonCustomFields=结果
.getAsJsonObject(“post”).getAsJsonObject(
“自定义字段”);
字符串jsonMessage=jsonCustomFields
.getAsJsonArray(“消息”).get(0)
.toString();
message=jsonMessage;
Log.d(“我”,消息);//输出:“你好,世界”
}
});

离子中的
onCompleted
Asynctask

onPostExecute
相同。您正在
doInBackground
方法中创建另一个异步任务。因此流程是这样的:
doInBackground
被调用,在它里面用
ION创建一个新的异步任务。因此,内部异步任务中的代码可以在执行其他所有操作之后执行。

其中是
字符串消息
声明。消息为空@
Log.d(“me”,消息)
更新了我的问题,显示String message被声明为类的成员变量。change
String message=null
字符串消息=”
您不是正在
doInBackground
方法中创建另一个异步任务吗?因此流程是这样的:
doInBackground
被调用,其中使用
ION创建了一个新的异步任务。使用
doInBackground
返回null。因此,内部异步任务中的代码可能会在执行其他任务之后执行。我的想法是在后台使用离子。我认为这将是解决办法。我现在就去看看。
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"


                    }
                });