title: java.lang.NullPointerException: Attempt to invoke virtual method on a null object reference while getting instance of other class and method
body: <p>I am Working on Android Project , Error i am facing displayed below , i am trying to call prefrenceManager from login activity through MyApplication instance, but i am geting null pointer exception i dont know why , i might not grabbing the getPrefM() but i check all , everything seems to be fine , where i am making a mistake , kindly help me out .</p>
  
  <pre><code>01-01 15:32:35.571 32658-32658/com.adnan.zwd.hidoctor E/UncaughtException: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.adnan.zwd.hidoctor/com.adnan.zwd.hidoctor.activity.Login_Act}: java.lang.NullPointerException: Attempt to invoke virtual method 'com.adnan.zwd.hidoctor.helper.MyPrefM com.adnan.zwd.hidoctor.app.MyApplication.getPrefM()' on a null object reference
                                                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                                                 at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                 at android.os.Looper.loop(Looper.java:148)
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                              Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.adnan.zwd.hidoctor.helper.MyPrefM com.adnan.zwd.hidoctor.app.MyApplication.getPrefM()' on a null object reference
                                                                                 at com.adnan.zwd.hidoctor.activity.Login_Act.onCreate(Login_Act.java:54)
                                                                                 at android.app.Activity.performCreate(Activity.java:6251)
                                                                                 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                                                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                                                                                 at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                 at android.os.Looper.loop(Looper.java:148) 
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                                 at java.lang.reflect.Method.invoke(Native Method) 
                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
  </code></pre>
  
  <p><strong>Login_Act.java:</strong></p>
  
  <pre><code>import android.content.Intent;
  import android.os.Bundle;
  import android.support.design.widget.TextInputLayout;
  import android.support.v7.app.AppCompatActivity;
  import android.support.v7.widget.Toolbar;
  import android.text.Editable;
  import android.text.TextUtils;
  import android.text.TextWatcher;
  import android.util.Log;
  import android.view.View;
  import android.view.WindowManager;
  import android.widget.Button;
  import android.widget.EditText;
  import android.widget.Toast;
  
  import com.android.volley.NetworkResponse;
  import com.android.volley.Request;
  import com.android.volley.Response;
  import com.android.volley.VolleyError;
  import com.android.volley.toolbox.StringRequest;
  
  import org.json.JSONException;
  import org.json.JSONObject;
  
  import java.util.HashMap;
  import java.util.Map;
  
  import com.adnan.zwd.hidoctor.R;
  import com.adnan.zwd.hidoctor.app.EndPoints;
  import com.adnan.zwd.hidoctor.app.MyApplication;
  import com.adnan.zwd.hidoctor.model.User;
  
  public class Login_Act extends AppCompatActivity {
  
      private String TAG = Login_Act.class.getSimpleName();
      private EditText inputName, inputEmail;
      private TextInputLayout inputLayoutName, inputLayoutEmail;
      private Button btnEnter;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
  
  
  
  
  
          /**
           * Check for login session. It user is already logged in
           * redirect him to main activity
           * */
          if (MyApplication.getInstance().getPrefM().getUser() != null) {
              startActivity(new Intent(this, Main_Act.class));
              finish();
          }
  
          setContentView(R.layout.login_activity);
  
          Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
          setSupportActionBar(toolbar);
          inputLayoutName = (TextInputLayout) findViewById(R.id.input_layout_name);
          inputLayoutEmail = (TextInputLayout) findViewById(R.id.input_layout_email);
          inputName = (EditText) findViewById(R.id.input_name);
          inputEmail = (EditText) findViewById(R.id.input_email);
          btnEnter = (Button) findViewById(R.id.btn_enter);
  
          inputName.addTextChangedListener(new MyTextWatcher(inputName));
          inputEmail.addTextChangedListener(new MyTextWatcher(inputEmail));
  
          btnEnter.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                  login();
              }
          });
      }
  
      /**
       * logging in user. Will make http post request with name, email
       * as parameters
       */
      private void login() {
          if (!validateName()) {
              return;
          }
  
          if (!validateEmail()) {
              return;
          }
  
          final String name = inputName.getText().toString();
          final String email = inputEmail.getText().toString();
  
          StringRequest strReq = new StringRequest(Request.Method.POST,
                  EndPoints.LOGIN, new Response.Listener&lt;String&gt;() {
  
              @Override
              public void onResponse(String response) {
                  Log.e(TAG, "response: " + response);
  
                  try {
                      JSONObject obj = new JSONObject(response);
  
                      // check for error flag
                      if (obj.getBoolean("error") == false) {
                          // user successfully logged in
  
                          JSONObject userObj = obj.getJSONObject("user");
                          User user = new User(userObj.getString("user_id"),
                                  userObj.getString("name"),
                                  userObj.getString("email"));
  
                          // storing user in shared preferences
                          MyApplication.getInstance().getPrefM().storeUser(user);
  
                          // start main activity
                          startActivity(new Intent(getApplicationContext(), Main_Act.class));
                          finish();
  
                      } else {
                          // login error - simply toast the message
                          Toast.makeText(getApplicationContext(), "" + obj.getJSONObject("error").getString("message"), Toast.LENGTH_LONG).show();
                      }
  
                  } catch (JSONException e) {
                      Log.e(TAG, "json parsing error: " + e.getMessage());
                      Toast.makeText(getApplicationContext(), "Json parse error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                  }
              }
          }, new Response.ErrorListener() {
  
              @Override
              public void onErrorResponse(VolleyError error) {
                  NetworkResponse networkResponse = error.networkResponse;
                  Log.e(TAG, "Volley error: " + error.getMessage() + ", code: " + networkResponse);
                  Toast.makeText(getApplicationContext(), "Volley error: " + error.getMessage(), Toast.LENGTH_SHORT).show();
              }
          }) {
  
              @Override
              protected Map&lt;String, String&gt; getParams() {
                  Map&lt;String, String&gt; params = new HashMap&lt;&gt;();
                  params.put("name", name);
                  params.put("email", email);
  
                  Log.e(TAG, "params: " + params.toString());
                  return params;
              }
          };
  
          //Adding request to request queue
          MyApplication.getInstance().addToRequestQueue(strReq);
      }
  
      private void requestFocus(View view) {
          if (view.requestFocus()) {
              getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
          }
      }
  
      // Validating name
      private boolean validateName() {
          if (inputName.getText().toString().trim().isEmpty()) {
              inputLayoutName.setError(getString(R.string.err_msg_name));
              requestFocus(inputName);
              return false;
          } else {
              inputLayoutName.setErrorEnabled(false);
          }
  
          return true;
      }
  
      // Validating email
      private boolean validateEmail() {
          String email = inputEmail.getText().toString().trim();
  
          if (email.isEmpty() || !isValidEmail(email)) {
              inputLayoutEmail.setError(getString(R.string.err_msg_email));
              requestFocus(inputEmail);
              return false;
          } else {
              inputLayoutEmail.setErrorEnabled(false);
          }
  
          return true;
      }
  
      private static boolean isValidEmail(String email) {
          return !TextUtils.isEmpty(email) &amp;&amp; android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
      }
  
      private class MyTextWatcher implements TextWatcher {
  
          private View view;
          private MyTextWatcher(View view) {
              this.view = view;
          }
  
          public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
          }
  
          public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
          }
  
          public void afterTextChanged(Editable editable) {
              switch (view.getId()) {
                  case R.id.input_name:
                      validateName();
                      break;
                  case R.id.input_email:
                      validateEmail();
                      break;
              }
          }
      }
  }
  </code></pre>
  
  <p><strong>MyApplication.java:</strong></p>
  
  <pre><code>public class MyApplication extends Application {
  
      public static final String TAG = MyApplication.class
              .getSimpleName();
  
      private RequestQueue mRequestQueue;
  
      private static MyApplication mInstance;
  
      private MyPrefM pref;
  
      @Override
      public void onCreate() {
          super.onCreate();
          mInstance = MyApplication.this;
      }
  
      public static synchronized MyApplication getInstance() {
          return mInstance;
      }
  
      public RequestQueue getRequestQueue() {
          if (mRequestQueue == null) {
              mRequestQueue = Volley.newRequestQueue(getApplicationContext());
          }
  
          return mRequestQueue;
      }
  
      public MyPrefM getPrefM() {
          if (pref == null) {
              pref = new MyPrefM(MyApplication.this);
          }
  
          return pref;
      }
  
      public &lt;T&gt; void addToRequestQueue(Request&lt;T&gt; req, String tag) {
          req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
          getRequestQueue().add(req);
      }
  
      public &lt;T&gt; void addToRequestQueue(Request&lt;T&gt; req) {
          req.setTag(TAG);
          getRequestQueue().add(req);
      }
  
      public void cancelPendingRequests(Object tag) {
          if (mRequestQueue != null) {
              mRequestQueue.cancelAll(tag);
          }
      }
  
      public void logout() {
          pref.clear();
          Intent intent = new Intent(this, Login_Act.class);
          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
          startActivity(intent);
      }
  }
  </code></pre>
  
  <p><strong>MyPrefM.java:</strong></p>
  
  <pre><code>public class MyPrefM {
  
      private String TAG = MyPrefM.class.getSimpleName();
  
      // Shared Preferences
      SharedPreferences pref;
  
      // Editor for Shared preferences
      SharedPreferences.Editor editor;
  
      // Context
      Context _context;
  
      // Shared pref mode
      int PRIVATE_MODE = 0;
  
      // Sharedpref file name
      private static final String PREF_NAME = "androidhive_gcm";
  
      // All Shared Preferences Keys
      private static final String KEY_USER_ID = "user_id";
      private static final String KEY_USER_NAME = "user_name";
      private static final String KEY_USER_EMAIL = "user_email";
      private static final String KEY_NOTIFICATIONS = "notifications";
  
      // Constructor
      public MyPrefM(Context context) {
          this._context = context;
          pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
          editor = pref.edit();
      }
  
  
      public void storeUser(User user) {
          editor.putString(KEY_USER_ID, user.getId());
          editor.putString(KEY_USER_NAME, user.getName());
          editor.putString(KEY_USER_EMAIL, user.getEmail());
          editor.commit();
  
          Log.e(TAG, "User is stored in shared preferences. " + user.getName() + ", " + user.getEmail());
      }
  
      public User getUser() {
          if (pref.getString(KEY_USER_ID, null) != null) {
              String id, name, email;
              id = pref.getString(KEY_USER_ID, null);
              name = pref.getString(KEY_USER_NAME, null);
              email = pref.getString(KEY_USER_EMAIL, null);
  
              User user = new User(id, name, email);
              return user;
          }
          return null;
      }
  
      public void addNotification(String notification) {
  
          // get old notifications
          String oldNotifications = getNotifications();
  
          if (oldNotifications != null) {
              oldNotifications += "|" + notification;
          } else {
              oldNotifications = notification;
          }
  
          editor.putString(KEY_NOTIFICATIONS, oldNotifications);
          editor.commit();
      }
  
      public String getNotifications() {
          return pref.getString(KEY_NOTIFICATIONS, null);
      }
  
      public void clear() {
          editor.clear();
          editor.commit();
      }
  }
  </code></pre>