2016-01-07 18 views
-2

我正在開發使用Android Studios的註冊應用程序,但是一旦用戶嘗試註冊應用程序只是說註冊時出現錯誤而LogCat不會給出任何錯誤,以及在調試應用程序時,我仍然沒有錯誤。android app crahses和數據仍然進入數據庫

請你幫忙,告訴我我錯了,因爲代碼是正確的,因爲它是在幾個月前工作,但是因爲我從假日返回它只是說「註冊時發生錯誤」。

用戶數據被輸入到數據庫中,但它不允許用戶移動到下一個活動,因爲它顯示「註冊時發生錯誤」。請你幫忙或建議?

logcat的

01-07 15:14:42.933 2161-4203/com.Oakland E/JSON Parser: Error parsing data org.json.JSONException: Value 2016-01-07 of type java.lang.String cannot be converted to JSONObject 
01-07 15:14:42.938 2161-2161/com.Oakland E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: com.Oakland, PID: 2161 
                     java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.json.JSONObject.getString(java.lang.String)' on a null object reference 
                      at com.Oakland.Register$ProcessRegister.onPostExecute(Register.java:211) 
                      at com.Oakland.Register$ProcessRegister.onPostExecute(Register.java:171) 

線211- if (json.getString(KEY_SUCCESS) != null) {

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) { 
      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 occurred in registration"); 
       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     }} 
    public void NetAsync(View view){ 
     new NetCheck().execute(); 
    }} 

UserFunction.Java

//URL of the PHP API 

    private static String registerURL = "http://10.0.2.2/Register_api/"; 

private static String register_tag = "register"; 

    /** 
     * 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; 
     } 

JsonPasar.Java

public class JSONParser { 

    static InputStream is = null; 
    static JSONObject jObj = null; 
    static String json = ""; 

    // constructor 
    public JSONParser() { 

    } 

    public JSONObject getJSONFromUrl(String url, List<NameValuePair> params) { 

     // Making HTTP request 
     try { 
      // defaultHttpClient 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url); 
      httpPost.setEntity(new UrlEncodedFormEntity(params)); 

      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      is = httpEntity.getContent(); 

     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        is, "iso-8859-1"), 8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      is.close(); 
      json = sb.toString(); 
      Log.e("JSON", json); 
     } catch (Exception e) { 
      Log.e("Buffer Error", "Error converting result " + e.toString()); 
     } 

     // try parse the string to a JSON object 
     try { 
      jObj = new JSONObject(json); 
     } catch (JSONException e) { 
      Log.e("JSON Parser", "Error parsing data " + e.toString()); 
     } 

     // return JSON String 
     return jObj; 

    } 
} 

DatabaseHandler.Java

public class DatabaseHandler extends SQLiteOpenHelper { 

    // All Static variables 
    // Database Version 
    private static final int DATABASE_VERSION = 1; 

    // Database Name 
    private static final String DATABASE_NAME = "cloud_contacts"; 

    // Login table name 
    private static final String TABLE_LOGIN = "login"; 

    // Login Table Columns names 
    private static final String KEY_ID = "id"; 
    private static final String KEY_FIRSTNAME = "fname"; 
    private static final String KEY_LASTNAME = "lname"; 
    private static final String KEY_EMAIL = "email"; 
    private static final String KEY_USERNAME = "uname"; 
    private static final String KEY_UID = "uid"; 
    private static final String KEY_CREATED_AT = "created_at"; 

    public DatabaseHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // Creating Tables 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     String CREATE_LOGIN_TABLE = "CREATE TABLE " + TABLE_LOGIN + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," 
       + KEY_FIRSTNAME + " TEXT," 
       + KEY_LASTNAME + " TEXT," 
       + KEY_EMAIL + " TEXT UNIQUE," 
       + KEY_USERNAME + " TEXT," 
       + KEY_UID + " TEXT," 
       + KEY_CREATED_AT + " TEXT" + ")"; 
     db.execSQL(CREATE_LOGIN_TABLE); 
    } 

    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Drop older table if existed 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_LOGIN); 

     // Create tables again 
     onCreate(db); 
    } 

    /** 
    * Storing user details in database 
    * */ 
    public void addUser(String fname, String lname, String email, String uname, String uid, String created_at) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_FIRSTNAME, fname); // FirstName 
     values.put(KEY_LASTNAME, lname); // LastName 
     values.put(KEY_EMAIL, email); // Email 
     values.put(KEY_USERNAME, uname); // UserName 
     values.put(KEY_UID, uid); // Email 
     values.put(KEY_CREATED_AT, created_at); // Created At 

     // Inserting Row 
     db.insert(TABLE_LOGIN, null, values); 
     db.close(); // Closing database connection 
    } 


    /** 
    * Getting user data from database 
    * */ 
    public HashMap<String, String> getUserDetails(){ 
     HashMap<String,String> user = new HashMap<String,String>(); 
     String selectQuery = "SELECT * FROM " + TABLE_LOGIN; 

     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 
     // Move to first row 
     cursor.moveToFirst(); 
     if(cursor.getCount() > 0){ 
      user.put("fname", cursor.getString(1)); 
      user.put("lname", cursor.getString(2)); 
      user.put("email", cursor.getString(3)); 
      user.put("uname", cursor.getString(4)); 
      user.put("uid", cursor.getString(5)); 
      user.put("created_at", cursor.getString(6)); 
     } 
     cursor.close(); 
     db.close(); 
     // return user 
     return user; 
    } 






    /** 
    * Getting user login status 
    * return true if rows are there in table 
    * */ 
    public int getRowCount() { 
     String countQuery = "SELECT * FROM " + TABLE_LOGIN; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(countQuery, null); 
     int rowCount = cursor.getCount(); 
     db.close(); 
     cursor.close(); 

     // return row count 
     return rowCount; 
    } 


    /** 
    * Re crate database 
    * Delete all tables and create them again 
    * */ 
    public void resetTables(){ 
     SQLiteDatabase db = this.getWritableDatabase(); 
     // Delete All Rows 
     db.delete(TABLE_LOGIN, null, null); 
     db.close(); 
    } 
+0

我已經檢查過這個。但我仍在掙扎。請你能告訴我如何調試應用程序,看看變量有什麼問題。 –

回答

0

您應該編輯您的日誌語句或添加日誌語句,用以顯示字符串你想轉換成JSON對象包含了什麼。我也認爲現場實例化JSONObject而不是有一個靜態變量是適當的。

Log.e("Buffer Error", "Error converting result " + json); 

JSONObject jObj = new JSONObject(json); 

爲了防止空指針,你應該改變你的if語句:

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

發生了什麼事是有一個與你的JSONObject創建一個問題,它試圖調用的getString對作爲結果無效JSONObject的。

+0

當我將其更改爲此時,它僅說註冊時發生錯誤,即使它們沒有問題,但數據仍然會被輸入到數據庫中。 –