Reputation: 11931
I am trying to save an integer that will store how many times a user has tapped on an ImageView using the SharedPreferences interface. However, when I run the app it gives me null pointer exception on the line where I am declaring the sharedPreferences like this:
SharedPreferences mSharedPreferences = this.getPreferences(Context.MODE_PRIVATE);
This is my first time of using this interface and is is a little confusing to me. I do not have any idea why this is happening. this is the log:
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{koemdzhiev.com.eggyegg/koemdzhiev.com.eggyegg.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2236)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
at android.content.ContextWrapper.getPackageName(ContextWrapper.java:132)
at android.app.Activity.getLocalClassName(Activity.java:4987)
at android.app.Activity.getPreferences(Activity.java:5021)
at koemdzhiev.com.eggyegg.MainActivity.<init>(MainActivity.java:20)
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.Class.newInstance(Class.java:1606)
at android.app.Instrumentation.newActivity(Instrumentation.java:1066)
at
This is my code in the class that extends from the Application class:
public class EggyEggApplication extends Application {
@Override
public void onCreate() {
SharedPreferences mSharedPreferences = this.getSharedPreferences(getString(R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY), Context.MODE_PRIVATE);
SharedPreferences.Editor mEditor = mSharedPreferences.edit();
if(mSharedPreferences.contains(getString(R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY))== false) {
mEditor.putInt(getString(R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY), 0).apply();
}
}
This is my code in main activity:
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private int defaultValue;
private int i;
ImageView tapImage;
SharedPreferences mSharedPreferences = this.getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor mEditor = mSharedPreferences.edit();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tapImage = (ImageView)findViewById(R.id.tapImage);
tapImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
i++;
mEditor.putInt(getString(R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY),i);
mEditor.commit();
}
});
defaultValue = getResources().getInteger(R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY);
i = mSharedPreferences.getInt(getString(R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY),defaultValue);
int defaultValue = getResources().getInteger(R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY);
long lastTapNumber = mSharedPreferences.getInt(getString(R.string.koemdzhiev_eggyegg_PREFERENCE_FILE_KEY),defaultValue);
i = (int) lastTapNumber;
}
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
Upvotes: 3
Views: 16354
Reputation: 2737
Try -
public class MainActivity extends AppCompatActivity {
private static final String TAG = MainActivity.class.getSimpleName();
private int defaultValue;
private int i;
ImageView tapImage;
SharedPreferences mSharedPreferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSharedPreferences = this.getPreferences(Context.MODE_PRIVATE);
this.editor = mSharedPreferences.edit();
this.editor.commit();
tapImage = (ImageView)findViewById(R.id.tapImage);
tapImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
i++;
setValueToSharedPref("TAP_NUMBER",i);
}
});
long lastTapNumber = mSharedPreferences.getInt("TAP_NUMBER",0);
i = (int) lastTapNumber;
}
public void setValueToSharedPref(String key, boolean value) {
this.editor.putBoolean(key, value);
this.editor.commit();
}
private boolean isNetworkAvailable() {
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
Upvotes: 0
Reputation: 157487
In the Activity, move
SharedPreferences mSharedPreferences = this.getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor mEditor = mSharedPreferences.edit();
inside onCreate
. Yo need a Context
to access the SharedPreferences
. Internally getPreferences(Context.MODE_PRIVATE)
, call getPackageName.
Edit
You should avoid to use localized strings as key for your SharedPreferences
Upvotes: 3
Reputation: 2060
the problem is this line in your MainActivity:
SharedPreferences mSharedPreferences = this.getPreferences(Context.MODE_PRIVATE);
the exceptions said, you get a nullpointer,
this nullpointer happens because the context is null, this happens because the line above is executed before the activity is finished with creation,
so move this line into you onCreate Method should solve the problem
Upvotes: 12
Reputation: 1064
Well you said you save integer so they key word you are lookig for is
"java.lang.String android.content.Context.getPackageName()"
Edit: My bad! There is probably something wrong in on create method
Upvotes: 1