Java - 获取 JSONObject 时出现 NullPointerException [英] Java - NullPointerException when getting JSONObject
问题描述
我正在尝试使用 Lukencode 的 RestClient 类.我有一个名为 UserFunctions
的类来通过 RestClient 检索 JSONObject:
I'm trying to implement a login feature in my Android app using Lukencode's RestClient class. I have a class named UserFunctions
to retrieve JSONObject via RestClient:
public class UserFunctions {
private RestClient restClient;
private String json;
private Context mContext;
private static String login_tag = "login";
private static String register_tag = "register";
// constructor
public UserFunctions(Context context){
restClient = new RestClient("http://10.0.2.2:81/HGourmet/user");
mContext = context;
}
/**
* function make Login Request
* @param email
* @param password
* */
public JSONObject loginUser(String email, String password){
// Building Parameters
restClient.AddParam("tag", login_tag);
restClient.AddParam("email", email);
restClient.AddParam("password", password);
// getting JSON Object
try{
restClient.Execute(RequestMethod.POST);
}catch(Exception e){
e.printStackTrace();
}
json = restClient.getResponse();
JSONObject jObj = null;
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
return jObj;
}
下面是我在 logcat 中得到的:
And below is what I get in logcat:
01-06 09:01:05.805: E/Trace(1819): error opening trace file: No such file or directory (2)
01-06 09:02:05.485: E/AndroidRuntime(1819): FATAL EXCEPTION: main
01-06 09:02:05.485: E/AndroidRuntime(1819): java.lang.NullPointerException
01-06 09:02:05.485: E/AndroidRuntime(1819): at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
01-06 09:02:05.485: E/AndroidRuntime(1819): at org.json.JSONTokener.nextValue(JSONTokener.java:94)
01-06 09:02:05.485: E/AndroidRuntime(1819): at org.json.JSONObject.<init>(JSONObject.java:154)
01-06 09:02:05.485: E/AndroidRuntime(1819): at org.json.JSONObject.<init>(JSONObject.java:171)
01-06 09:02:05.485: E/AndroidRuntime(1819): at com.hanu.hgourmet.library.UserFunctions.loginUser(UserFunctions.java:49)
01-06 09:02:05.485: E/AndroidRuntime(1819): at com.hanu.hgourmet.LoginActivity$1.onClick(LoginActivity.java:56)
01-06 09:02:05.485: E/AndroidRuntime(1819): at android.view.View.performClick(View.java:4202)
01-06 09:02:05.485: E/AndroidRuntime(1819): at android.view.View$PerformClick.run(View.java:17340)
01-06 09:02:05.485: E/AndroidRuntime(1819): at android.os.Handler.handleCallback(Handler.java:725)
01-06 09:02:05.485: E/AndroidRuntime(1819): at android.os.Handler.dispatchMessage(Handler.java:92)
01-06 09:02:05.485: E/AndroidRuntime(1819): at android.os.Looper.loop(Looper.java:137)
01-06 09:02:05.485: E/AndroidRuntime(1819): at android.app.ActivityThread.main(ActivityThread.java:5039)
01-06 09:02:05.485: E/AndroidRuntime(1819): at java.lang.reflect.Method.invokeNative(Native Method)
01-06 09:02:05.485: E/AndroidRuntime(1819): at java.lang.reflect.Method.invoke(Method.java:511)
01-06 09:02:05.485: E/AndroidRuntime(1819): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-06 09:02:05.485: E/AndroidRuntime(1819): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-06 09:02:05.485: E/AndroidRuntime(1819): at dalvik.system.NativeStart.main(Native Method)
我真的希望有人能帮我查明这个问题的原因.非常感谢.
I really hope that someone would help me pinpoint the reason of this problem. Thank you very much.
推荐答案
我不会详细说明您应该如何执行此操作,而只会说明它为什么会发生.根据定义,AsyncTask 是异步的.这意味着当您执行它时,它会在不同的线程中并行执行其工作.所以你不能指望它在 execute()
被调用后立即终止(否则它会被称为 SyncTask,并且没有任何存在的理由).
I won't expand on how you should do this, but only on why it happens. An AsyncTask, by definition, is asynchronous. This means that when you execute it, it does its job in parallel, in a different thread. So you can't expect it to be terminated right after execute()
has been called (else it would be called SyncTask, and wouldn't have any reason to exist).
将 AsyncTask
视为烤面包机.当您启动烤面包机(执行 AsyncTask)时,它会烤面包,但不会立即返回烤好的面包.烤它需要一些时间.当它烤面包时,您可以做其他事情(因此不会完全冻结 UI 线程).当它烤完你的面包时,它会用叮当声!通知你面包已经烤好了.这是同样的事情.您应该只在 AsyncTask 通知您它已完成执行时才开始使用 json
(烤面包).
See AsyncTask
as a toaster. When you start the toaster (execute the AsyncTask), it toasts your bread, but doesn't return the toasted bread immediately. It takes some time to toast it. While it's toasting your bread, you can do something else (and thus not freeze the UI thread completely). And when it has finished toasting your bread, it notifies you with a ding! that the bread is toasted. That's the same thing here. You should only start using json
(the toasted bread), when the AsyncTask notifies you that it has finished executing.
这篇关于Java - 获取 JSONObject 时出现 NullPointerException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!