2017-08-05 220 views
-1

我正在尝试使用AsyncTask来做HTTP POST。我必须创建Response类,因为我们不能扩展多个类。在Response类,我接受HTTP请求的响应,然后根据响应开始新的活动。行:responseClass.responseFunction(response);正在抛出NullPointer异常。我如何从登录方法采取response空指针异常

public class Login extends AsyncTask <String, Void, Void> { 

    Response responseClass = new Response(); 

    @Override 
    protected Void doInBackground(String... strings) { 
     String email = strings[0]; 
     String password = strings[1]; 

     login(email, password); 

     return null; 
    } 

    public void login(String email, String password) { 
     HttpURLConnection connection; 
     OutputStreamWriter request = null; 

     URL url = null; 
     String response = null; 
     String parameters = "email=" + email + "&password=" + password; 

     try { 
      url = new URL("url"); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoOutput(true); 
      connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
      connection.setRequestMethod("POST"); 

      request = new OutputStreamWriter(connection.getOutputStream()); 
      request.write(parameters); 
      request.flush(); 
      request.close(); 
      String line = ""; 
      InputStreamReader isr = new InputStreamReader(connection.getInputStream()); 
      BufferedReader reader = new BufferedReader(isr); 
      StringBuilder sb = new StringBuilder(); 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 

      System.out.println("parameter: " + parameters); 
      // Response from server after login process will be stored in response variable. 
      response = sb.toString(); 
      isr.close(); 
      reader.close(); 
     } catch (IOException e) { 
      // Error 

     } 
     System.out.print("response" +response); 
     responseClass.responseFunction(response); 

    } 

    class Response extends AppCompatActivity{ 

     public void responseFunction(String response){ 

      if(response.charAt(0) == '1'){ 

      Toast.makeText(getApplicationContext(), "e-mail veya şifre hatalı!", Toast.LENGTH_LONG).show(); 

     } 
     else if(response.charAt(0) == '0'){ 
      System.out.print("Sonucc1"); 
      Toast.makeText(getApplicationContext(), "Başarıyla giriş yapıldı!", Toast.LENGTH_LONG).show(); 

      //session.createLoginSession(email,password); 
      Intent intent = new Intent(this, Amount.class); 
      startActivity(intent); 
     } 
     else if(response.charAt(0)== '2'){ 
      Toast.makeText(getApplicationContext(), "Geçerli bir e-mail adresi giriniz!", Toast.LENGTH_LONG).show(); 
     } 
     else if(response.charAt(0)=='3'){ 
      Toast.makeText(getApplicationContext(), "Şifre 6 karakterden kısa olamaz!", Toast.LENGTH_LONG).show(); 


      } 
     } 

    } 
} 

这里是logcat的:

E/AndroidRuntime: FATAL EXCEPTION: main 
                 Process: com.example.merve.tev, PID: 20768 
                 java.lang.NullPointerException 
                  at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:109) 
                  at com.example.merve.tev.Login$Response.responseFunction(Login.java:97) 
                  at com.example.merve.tev.Login.login(Login.java:82) 
                  at com.example.merve.tev.Login.doInBackground(Login.java:31) 
                  at com.example.merve.tev.LoginActivity$1.onClick(LoginActivity.java:54) 
                  at android.view.View.performClick(View.java:4438) 
                  at android.view.View$PerformClick.run(View.java:18422) 
                  at android.os.Handler.handleCallback(Handler.java:733) 
                  at android.os.Handler.dispatchMessage(Handler.java:95) 
                  at android.os.Looper.loop(Looper.java:136) 
                  at android.app.ActivityThread.main(ActivityThread.java:5017) 
                  at java.lang.reflect.Method.invokeNative(Native Method) 
                  at java.lang.reflect.Method.invoke(Method.java:515) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
                  at dalvik.system.NativeStart.main(Native Method) 

线97:Toast.makeText( “!Başarıylagirişyapıldı” getApplicationContext(),Toast.LENGTH_LONG).show();

+1

我看不到'responseClass'在哪里被赋值。它也似乎没有被注入。 –

+0

你有没有得到?您缺少responseClass变量的初始化... 响应responseClass = new Response(); – Bayou

+0

我初始化了responseClass。但是,NullPointer异常再次抛出。 @TimBiegeleisen – m1129839

回答

0

正如@Tim在评论中指出的,您只需要初始化您的responseClass变量。也许你想做到这一点,如下所示:在发生

public class Login extends AsyncTask <String, Void, Void> { 

    Response responseClass = new Response(); // initialisation 

    @Override 
    protected Void doInBackground(String... strings) { 
     ... 
     ... 
+0

我初始化了'responseClass',但是,NullPointer异常再次抛出。 – m1129839

+0

用确切的错误logcat更新你的问题。 – ZeekHuge

+0

“响应”本身是否为空? –

0

的错误,因为你总是被设置为null,响应串在String response = null;。你没有给任何例外的字符串。因此,每当代码面临异常时,responseClass.responseFunction(response);将收到null字符串。然后它会抛出空指针异常。

public void login(String email, String password) { 
    ... 
    // You always set response as null 
    String response = null; 
    try { 
     ... 
     StringBuilder sb = new StringBuilder(); 
     while ((line = reader.readLine()) != null) { 
     sb.append(line + "\n"); 
     } 
     ... 
     response = sb.toString(); 
      ... 
    } catch (IOException e) { 
     // Error 
     // But here you don't set any string for response 
    } 

    // Hence the response will be null an throw an exception. 
    System.out.print("response" +response); 
    responseClass.responseFunction(response); 
}