2 Replies - 1359 Views - Last Post: 18 December 2015 - 12:21 PM

#1 john_1993   User is offline

  • D.I.C Head

Reputation: -3
  • View blog
  • Posts: 148
  • Joined: 16-March 15

getJSONfromURL - Null Pointer Exception

Posted 18 December 2015 - 11:50 AM

I am trying to make a Register system for android. It registers users into the database and they receive an email confirmation, however the application crashes and closes.

I have checked the forum of how to correct NullPointer errors, however I am struggling, therefore could someone please offer me a helping hand. I have checked the post .What is a Null Pointer Exception, and how do I fix it?. Still cannot find my solution please advise and help.

I have also checked and just want to know why the following line below returns null, it was working few days ago however now I do not understand why its not working as it return null and the application crashes. The data does get entered into the database, however the application crashes.

Why does this line return null?

JSONObject json = jsonParser.getJSONFromUrl(registerURL,params); 
that is making the null value please advice?.

LogCat Error

CatLog - Error Messages

E/JSON Parser﹕ Error parsing data org.json.JSONException: Value 2015-12-09 of type java.lang.String cannot be converted to JSONObject

E/AndroidRuntime﹕ FATAL EXCEPTION: mainPID: 2386 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.app.tourist.Register$ProcessRegister.onPostExecute(Register.java:214

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


 private class ProcessRegister extends AsyncTask<String, String, JSONObject> { - Line 171: Giving Error Here.
    
     if (json.getString(KEY_SUCCESS) != null) { - Line 214: Giving Error.

Register.Java File

    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();
        }}


userFunction.registerUser()

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


Is This A Good Question/Topic? 0
  • +

Replies To: getJSONfromURL - Null Pointer Exception

#2 EndLessMind   User is offline

  • Android Expert
  • member icon

Reputation: 273
  • View blog
  • Posts: 1,252
  • Joined: 13-March 09

Re: getJSONfromURL - Null Pointer Exception

Posted 18 December 2015 - 12:06 PM

getJSONFromUrl dose not throw a NullPointerException, it's throws a JSONException :
Error parsing data org.json.JSONException

Some other line is throwing an NullPointerException as you're trying to get a string from the JSONObject.
But the JSONObject never got initialized due to the JSONException.


How to fix this?

Well, my best guess is that the data returned from the server is not pure json-data and can therefore not be parsed as if it where.

Check the data from the server. If you're using PHP to make request to the database and then print the result, then there might be some characters a the start of the returned data.

In some of my old projects I had to remove the first 3 characters of the returned data (using (il]data.substring(3);[/il] ).
I don't know why there where 3 characters, but the issue went away when i updated the apache server.
Was This Post Helpful? 0
  • +
  • -

#3 john_1993   User is offline

  • D.I.C Head

Reputation: -3
  • View blog
  • Posts: 148
  • Joined: 16-March 15

Re: getJSONfromURL - Null Pointer Exception

Posted 18 December 2015 - 12:21 PM

Login is working fine, however the data gets inserted into the database and sends user an email confirmation. Could you please help and check what is causing the null error and how can I fix this. few days ago it was working fine, however now its not working.
Was This Post Helpful? 0
  • +
  • -

Page 1 of 1