android应用程序崩溃,由于java.lang.NullPointerException

问题描述:

我遵循一个andorid开发指南,似乎在尝试注册帐户时出现错误,我意识到问题和位置(第197行),但我无法似乎解决了问题 请在下面找到logcat和我的注册码的副本,如果有任何更多的信息,你需要请评论,我会尝试和帮助。android应用程序崩溃,由于java.lang.NullPointerException

04-24 21:24:32.735: E/AndroidRuntime(30368): FATAL EXCEPTION: main 
04-24 21:24:32.735: E/AndroidRuntime(30368): java.lang.NullPointerException 
04-24 21:24:32.735: E/AndroidRuntime(30368): at com.loggedin.Register$ProcessRegister.onPostExecute(Register.java:197) 
04-24 21:24:32.735: E/AndroidRuntime(30368): at com.loggedin.Register$ProcessRegister.onPostExecute(Register.java:1) 
04-24 21:24:32.735: E/AndroidRuntime(30368): at android.os.AsyncTask.finish(AsyncTask.java:631) 
04-24 21:24:32.735: E/AndroidRuntime(30368): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
04-24 21:24:32.735: E/AndroidRuntime(30368): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
04-24 21:24:32.735: E/AndroidRuntime(30368): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-24 21:24:32.735: E/AndroidRuntime(30368): at android.os.Looper.loop(Looper.java:176) 
04-24 21:24:32.735: E/AndroidRuntime(30368): at android.app.ActivityThread.main(ActivityThread.java:5419) 
04-24 21:24:32.735: E/AndroidRuntime(30368): at java.lang.reflect.Method.invokeNative(Native Method) 
04-24 21:24:32.735: E/AndroidRuntime(30368): at java.lang.reflect.Method.invoke(Method.java:525) 
04-24 21:24:32.735: E/AndroidRuntime(30368): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 
04-24 21:24:32.735: E/AndroidRuntime(30368): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 
04-24 21:24:32.735: E/AndroidRuntime(30368): at dalvik.system.NativeStart.main(Native Method) 
04-24 21:25:05.435: I/Process(30368): Sending signal. PID: 30368 SIG: 9 

注册Java

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 
import com.loggedin.internal.DatabaseHandler; 
import com.loggedin.internal.UserFunctions; 
import org.json.JSONException; 
import org.json.JSONObject; 
import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

public class Register extends Activity { 
/** 
* JSON Response node names. 
**/ 
private static String KEY_SUCCESS = "success"; 
private static String KEY_UID = "id"; 
private static String KEY_FIRSTNAME = "FirstName"; 
private static String KEY_LASTNAME = "LastName"; 
private static String KEY_USERNAME = "Username"; 
private static String KEY_EMAIL = "email"; 
private static String KEY_DOB = "DOB"; 
private static String KEY_CREATED_AT = "created_at"; 
private static String KEY_ERROR = "error"; 
/** 
* Defining layout items. 
**/ 
EditText inputFirstName; 
EditText inputLastName; 
EditText inputUsername; 
EditText inputEmail; 
EditText inputDOB; 
EditText inputPassword; 
Button registerbtn; 
TextView register_error; 
/** 
* Called when the activity is first created. 
*/ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_register); 
/** 
* Defining all layout items 
**/ 
    inputFirstName = (EditText) findViewById(R.id.FirstName); 
    inputLastName = (EditText) findViewById(R.id.LastName); 
    inputUsername = (EditText) findViewById(R.id.Username); 
    inputEmail = (EditText) findViewById(R.id.email); 
    inputDOB = (EditText) findViewById(R.id.DOB); 
    inputPassword = (EditText) findViewById(R.id.Password); 
    registerbtn = (Button) findViewById(R.id.registerbtn); 
    register_error = (TextView) findViewById(R.id.register_error); 
/** 
* Button which Switches back to the login screen on clicked 
**/ 
    Button login = (Button) findViewById(R.id.bktologinbtn); 
    login.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      Intent myIntent = new Intent(view.getContext(), Login.class); 
      startActivityForResult(myIntent, 0); 
      finish(); 
     } 
    }); 
    /** 
    * Register Button click event. 
    * A Toast is set to alert when the fields are empty. 
    * Another toast is set to alert Username must be 5 characters. 
    **/ 
    registerbtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if ( (!inputUsername.getText().toString().equals("")) && (!inputPassword.getText().toString().equals("")) && (!inputFirstName.getText().toString().equals("")) && (!inputLastName.getText().toString().equals("")) && (!inputDOB.getText().toString().equals("")) && (!inputEmail.getText().toString().equals(""))) 
      { 
       if (inputUsername.getText().toString().length() > 5){ 
       InternetAsync(view); 
       } 
       else 
       { 
        Toast.makeText(getApplicationContext(), 
          "Username should be minimum 5 characters", Toast.LENGTH_SHORT).show(); 
       } 
      } 
      else 
      { 
       Toast.makeText(getApplicationContext(), 
         "One or more fields are empty", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    }); 
    } 
    /** 
    * Async Task to check whether internet connection is working 
    **/ 
    private class InternetCheck extends AsyncTask<String, Boolean, Boolean> { 
    private ProgressDialog nDialog; 
    @Override 
    protected void onPreExecute(){ 
     super.onPreExecute(); 
     nDialog = new ProgressDialog(Register.this); 
     nDialog.setMessage("Loading.."); 
     nDialog.setTitle("Checking Network"); 
     nDialog.setIndeterminate(false); 
     nDialog.setCancelable(true); 
     nDialog.show(); 
    } 
    @Override 
    protected Boolean doInBackground(String... args){ 
/** 
    * Gets current device state and checks for working internet connection by trying Google. 
    **/ 
     ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
     if (netInfo != null && netInfo.isConnected()) { 
      try { 
       URL url = new URL("http://www.google.com"); 
       HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); 
       urlc.setConnectTimeout(3000); 
       urlc.connect(); 
       if (urlc.getResponseCode() == 200) { 
        return true; 
       } 
      } catch (MalformedURLException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     return false; 
    } 
    @Override 
    protected void onPostExecute(Boolean th){ 
     if(th == true){ 
      nDialog.dismiss(); 
      new ProcessRegister().execute(); 
     } 
     else{ 
      nDialog.dismiss(); 
      register_error.setText("Error in Network Connection"); 
     } 
    } 
    } 
private class ProcessRegister extends AsyncTask <String, String, JSONObject>{ 
/** 
    * Defining Process dialog 
    **/ 
    private ProgressDialog pDialog; 
    String email,Password,FirstName,LastName,DOB,Username; 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     inputUsername = (EditText) findViewById(R.id.Username); 
     inputPassword = (EditText) findViewById(R.id.Password); 
      FirstName = inputFirstName.getText().toString(); 
      LastName = inputLastName.getText().toString(); 
      email = inputEmail.getText().toString(); 
      DOB = inputDOB.getText().toString(); 
      Username= inputUsername.getText().toString(); 
      Password = inputPassword.getText().toString(); 
     pDialog = new ProgressDialog(Register.this); 
     pDialog.setTitle("Contacting Servers"); 
     pDialog.setMessage("Registering ..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
    } 
    @Override 
    protected JSONObject doInBackground(String... args) { 
    UserFunctions userFunction = new UserFunctions(); 
    JSONObject json = userFunction.registerUser(FirstName, LastName, DOB, email, Username, Password); 
     return json; 
    } 
    @Override 
    protected void onPostExecute(JSONObject json) { 
    /** 
    * Checks for success message. 
    **/ 
     if (json ==null){ 

     } 
      try { 
       if (json.getString(KEY_SUCCESS) != null) { 
        register_error.setText(""); 
        String res = json.getString(KEY_SUCCESS); 
        String red = json.getString(KEY_ERROR); 
        if(Integer.parseInt(res) == 1){ 
         pDialog.setTitle("Getting Data"); 
         pDialog.setMessage("Loading Info"); 
         register_error.setText("Successfully Registered"); 
         DatabaseHandler db = new DatabaseHandler(getApplicationContext()); 
         JSONObject json_user = json.getJSONObject("user"); 
         /** 
         * Removes all the previous data in the SQlite database 
         **/ 
         UserFunctions logout = new UserFunctions(); 
         logout.logoutUser(getApplicationContext()); 
         db.addUser(json_user.getString(KEY_FIRSTNAME),json_user.getString(KEY_LASTNAME),json_user.getString(KEY_EMAIL),json_user.getString(KEY_USERNAME),json_user.getString(KEY_UID),json_user.getString(KEY_CREATED_AT)); 
         /** 
         * Stores registered data in SQlite Database 
         * Launch Registered screen 
         **/ 
         Intent registered = new Intent(getApplicationContext(), Registered.class); 
         /** 
         * Close all views before launching Registered screen 
         **/ 
         registered.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
         pDialog.dismiss(); 
         startActivity(registered); 
          finish(); 
        } 
        else if (Integer.parseInt(red) ==2){ 
         pDialog.dismiss(); 
         register_error.setText("User already exists"); 
        } 
        else if (Integer.parseInt(red) ==3){ 
         pDialog.dismiss(); 
         register_error.setText("Invalid Email id"); 
        } 
       } 
        else{ 
        pDialog.dismiss(); 
         register_error.setText("Error occured in registration"); 
        } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    public void InternetAsync(View view){ 
     new InternetCheck().execute(); 
    } 
    } 
+1

哪里线197? –

+0

你在哪里打你的onPostExecute NPE? – zgc7009

+0

我敢打赌,它是在pDialog.setTitle – zgc7009

好像JSON对象为null。你应该以正确的方式处理。现在你只是无视它。在这里:

/** 
    * Checks for success message. 
    **/ 
    if (json ==null){ 
     return; // <-- just a sample, handle null in yuor way, don't ignore it 
    } 

我可以看到三种可能:

if (json ==null){ 

} 

这是无所作为和JSON可能是无效和

json.getString(KEY_SUCCESS) 

可能是罪魁祸首。

另一种可能性可能是pDialogregister_error。确保在引用前检查每个资源,你可以看到每个人都猜测它是哪一个资源。 事实上,NPE是最常见的例外之一,因此请确保在使用之前验证数据,以免引起一些头痛。

解决方案:

if (json ==null){ 
    return; //You can potentially Log the error too, if it helps. 
} 

OR

if(json != null) { 
    try{ 
     if (json.getString(KEY_SUCCESS) != null) { 
     //... 
} 

此外,添加检查:

if(pDialog != null) { 
    //Manipulate the element to do what you want. 
} 

if(register_error != null) { 
    //Manipulate the element to do what you want. 
} 
+0

你好Erick,我尝试删除如果(json == null)和错误转移到第194行com.loggedin.Register $ ProcessRegister.onPostExecute(Register.java:194)我仍然有点不确定我如何解决这个问题问题 – user3570519

+0

这不仅仅是删除它的问题,您必须忽略该案例,或者只有在json实际上有某些事情时才处理。正如肯说。我已经更新了答案,为您指出了正确的方向。 – Toguard