2013-01-06 57 views
2

我试图在我的Android应用中使用Lukencode的RestClient类实现登录功能。我有一个名为UserFunctions通过RESTClient实现检索的JSONObject类:Java - 获取JSONObject时的NullPointerException

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:

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) 

我真的希望有人会帮我找出这个问题的原因。非常感谢你。

+2

'public JSONObject loginUser(String email,String password)'返回'jObj',但不创建'jObj'。也许这是你的问题? – Mike

+0

当我调用'new GetUser()。execute();'不是吗? –

+3

这太令人沮丧了。难道你没有意识到logcat堆栈跟踪会告诉你该错误是在哪一行吗?敬酒不是调试的好方法。使用调试器浏览代码。同时,请发布异常的堆栈跟踪。 – Simon

回答

11

我不会扩展你应该怎么做,而只是为什么发生。按定义,AsyncTask是异步的。这意味着当你执行它时,它会在另一个线程中并行执行它的工作。所以你不能期望它在​​被调用后立即终止(否则它将被称为SyncTask,并且没有任何理由存在)。

查看AsyncTask作为烤面包机。当你开始烤面包机(执行AsyncTask)时,它会烤面包,但不会立即返回烤面包。它需要一些时间来敬酒。当它烘烤你的面包时,你可以做其他事情(因此不会完全冻结UI线程)。当它完成烘烤你的面包时,它会通知你一个面包被烤。这是同样的事情。当AsyncTask通知您它已完成执行时,您应该只开始使用json(烘烤的面包)。

+0

非常感谢你用这个来启发我。我会看看我能做些什么来解决这个问题。 –

+2

喜欢烤面包机的比喻。 +1 – Simon

+0

非常好的比喻 – Dimitri

相关问题