2015-12-25 2 views
-1

Я проверил форум о том, как исправить ошибки NullPointer, однако я боюсь, поэтому кто-то может предложить мне руку помощи. Я проверил сообщение. Что такое NullPointerException, и как его исправить ?. Все еще не можете найти мое решение, пожалуйста, посоветуйте и помогите.Android-приложение просто Crashes- Json is Null

сообщение об ошибке, что проблема: попытка вызвать виртуальный метод «java.lang.String org.json.JSONObject.getString (java.lang.String)» на нулевой ссылки на объект.

json is null при выполнении строки 214. Это также означает, что у меня есть вызов onPostExecute, передающий нулевой объект в качестве аргумента. Я отлаживал свое приложение и до сих пор не могу найти сообщение об ошибке, не могли бы вы помочь или посоветовать мне, как я могу это исправить.

CatLog - Сообщения об ошибках

Е/JSON синтаксического анализа: Ошибка синтаксического анализа org.json.JSONException данные: Значение 2015-12-09 типа java.lang.String не может быть преобразован в JSONObject

E/AndroidRuntime: FATAL EXCEPTION: mainPID: 2386 java.lang.NullPointerException: попытка вызвать виртуальный метод 'java.lang.String org.json.JSONObject.getString (java.lang.String)' на ссылка на нулевой объект

в com.app.tourist.Register $ ProcessRegister.onPostExecute (Register.java:214

в com.app.tourist.Register $ ProcessRegister.onPostExecute (Register.java:171)

private class ProcessRegister extends AsyncTask<String, String, JSONObject> { - Line 171: Gving Error Here. 

    if (json.getString(KEY_SUCCESS) != null) { - Line 214: Giving Error. 

Register.Java Файл

public class Register extends Activity { 


    /** 
    * JSON Response node names. 
    **/ 


    private static String KEY_SUCCESS = "success"; 
    private static String KEY_UID = "uid"; 
    private static String KEY_FIRSTNAME = "fname"; 
    private static String KEY_LASTNAME = "lname"; 
    private static String KEY_USERNAME = "uname"; 
    private static String KEY_EMAIL = "email"; 
    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 inputPassword; 
    ImageButton btnRegister; 
    TextView registerErrorMsg; 


    /** 
    * Called when the activity is first created. 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.register); 

     /** 
     * Defining all layout items 
     **/ 
     inputFirstName = (EditText) findViewById(R.id.fname); 
     inputLastName = (EditText) findViewById(R.id.lname); 
     inputUsername = (EditText) findViewById(R.id.uname); 
     inputEmail = (EditText) findViewById(R.id.email); 
     inputPassword = (EditText) findViewById(R.id.pword); 
     btnRegister = (ImageButton) findViewById(R.id.Registerbtn); 
     registerErrorMsg = (TextView) findViewById(R.id.register_error); 

     /** 
     * 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. 
     **/ 



     btnRegister.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("")) && (!inputEmail.getText().toString().equals(""))) 
       { 
        if (inputUsername.getText().toString().length() > 4){ 
         NetAsync(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 NetCheck extends AsyncTask<String,String,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(); 
       registerErrorMsg.setText("Error in Network Connection"); 
      } 
     } 
    } 


    private class ProcessRegister extends AsyncTask<String, String, JSONObject> { 

     /** 
     * Defining Process dialog 
     **/ 
     private ProgressDialog pDialog; 

     String email,password,fname,lname,uname; 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      inputUsername = (EditText) findViewById(R.id.uname); 
      inputPassword = (EditText) findViewById(R.id.pword); 
      fname = inputFirstName.getText().toString(); 
      lname = inputLastName.getText().toString(); 
      email = inputEmail.getText().toString(); 
      uname= 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(fname, lname, email, uname, password); 

      return json; 


     } 
     @Override 
     protected void onPostExecute(JSONObject json) { 
      /** 
      * Checks for success message. 
      **/ 
      try { 
       if (json.getString(KEY_SUCCESS) != null) { 
        registerErrorMsg.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"); 

         registerErrorMsg.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(); 
         registerErrorMsg.setText("User already exists"); 
        } 
        else if (Integer.parseInt(red) ==3){ 
         pDialog.dismiss(); 
         registerErrorMsg.setText("Invalid Email id"); 
        } 

       } 


       else{ 
        pDialog.dismiss(); 

        registerErrorMsg.setText("Error occured in registration"); 
       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 


      } 
     }} 
    public void NetAsync(View view){ 
     new NetCheck().execute(); 
    }} 

UserFuction.java Файл

/** 
    * Function to Register 
    **/ 
    public JSONObject registerUser(String fname, String lname, String email, String uname, String password){ 
     // Building Parameters 
     List params = new ArrayList(); 
     params.add(new BasicNameValuePair("tag", register_tag)); 
     params.add(new BasicNameValuePair("fname", fname)); 
     params.add(new BasicNameValuePair("lname", lname)); 
     params.add(new BasicNameValuePair("email", email)); 
     params.add(new BasicNameValuePair("uname", uname)); 
     params.add(new BasicNameValuePair("password", password)); 
     JSONObject json = jsonParser.getJSONFromUrl(registerURL,params); 
     return json; 
    } 
+0

Может ли вы объяснить, при регистрации в sqlite, как он возвращает значение типа json? –

ответ

2

Как видно из линии, также необходимо проверить, если объект

json 

равна нулю или нет, если она равна нулю, то нет никакого смысла, чтобы проверить, если он содержит какой-либо объект или нет. Чтобы избежать этого, необходимо убедиться в том, что объект JSON не является нулевым, и даже если она равна нулем, вы должны изменить состояние, как показано ниже:

if (json != null && json.getString(KEY_SUCCESS) != null) 

Надеется, что это помогает ..

+0

Эндрю заменить этот код на if (json.getString (KEY_SUCCESS)! = Null) {и вместо этого вставить if (json.getString (KEY_SUCCESS)! = Null) {. Это верно. –