2013-01-06 56 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

相關問題