I have an app which works almost perfect for around 500 users, BUT from time to time I am getting in Android Vitals report about Null Pointer Exception (always that same). For all 500 users, I got six times this error. I am not sure it is a lot, but it bothers me that I have a bug in my code. The problem is that it does not happen every use of my app and is very intermittent. Since a few days I am trying to reproduce it to fix it, but with no luck at all. Can I have your help, please?
Stacktrace:
java.lang.RuntimeException:
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3270)
at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3409)
at android.app.ActivityThread.handleRelaunchActivityInner (ActivityThread.java:5279)
at android.app.ActivityThread.handleRelaunchActivity (ActivityThread.java:5187)
at android.app.servertransaction.ActivityRelaunchItem.execute (ActivityRelaunchItem.java:69)
at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2016)
at android.os.Handler.dispatchMessage (Handler.java:107)
at android.os.Looper.loop (Looper.java:214)
at android.app.ActivityThread.main (ActivityThread.java:7356)
at java.lang.reflect.Method.invoke (Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:930)
// My app part start //////////////////////////////////////////////////////////////
Caused by: java.lang.NullPointerException:
at com.vulterey.nixieclockwidget.ConfigActivity.refreshClock (ConfigActivity.java:446)
at com.vulterey.nixieclockwidget.ConfigActivity.access$000 (ConfigActivity.java:63)
at com.vulterey.nixieclockwidget.ConfigActivity$SettingsFragment.onCreatePreferences (ConfigActivity.java:138)
// My app part end //////////////////////////////////////////////////////////////
at androidx.preference.PreferenceFragmentCompat.onCreate (PreferenceFragmentCompat.java:160)
at androidx.fragment.app.Fragment.performCreate (Fragment.java:2684)
at androidx.fragment.app.FragmentStateManager.create (FragmentStateManager.java:280)
at androidx.fragment.app.FragmentManager.moveToState (FragmentManager.java:1175)
at androidx.fragment.app.FragmentManager.moveToState (FragmentManager.java:1356)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState (FragmentManager.java:1434)
at androidx.fragment.app.FragmentManager.moveToState (FragmentManager.java:1497)
at androidx.fragment.app.FragmentManager.dispatchStateChange (FragmentManager.java:2625)
at androidx.fragment.app.FragmentManager.dispatchCreate (FragmentManager.java:2571)
at androidx.fragment.app.FragmentController.dispatchCreate (FragmentController.java:236)
at androidx.fragment.app.FragmentActivity.onCreate (FragmentActivity.java:315)
at androidx.appcompat.app.AppCompatActivity.onCreate (AppCompatActivity.java:106)
at com.vulterey.nixieclockwidget.ConfigActivity.onCreate (ConfigActivity.java:71)
at android.app.Activity.performCreate (Activity.java:7825)
at android.app.Activity.performCreate (Activity.java:7814)
at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1306)
at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3245)
A part of the code from ConfigActivity.java file:
Line
63 public class ConfigActivity extends AppCompatActivity {...
public static class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {
// Runs all services to enable/disable option preferences depend on user choices
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.root_preferences, rootKey);
...
//Runs refreshClock on Create Preferences to show settings base on Shared Preferences state
ConfigActivity refreshActivity = (ConfigActivity) this.getActivity();
138 refreshActivity.refreshClock(context);
...}
// Refreshes view of the clock in Config Activity to visualise changes in options made by user
private void refreshClock(Context context){...
// Gets all colors from Preference Manager
int hoursColor = PreferenceManager.getDefaultSharedPreferences(context).getInt("hoursColor", ContextCompat.getColor(context, R.color.clockTextColor));
...
//Sets color of the clock elements with colors from Preference Manager
TextView clockHours = activity.findViewById(R.id.clockHours);
446 clockHours.setTextColor(hoursColor);
...}
...}
The TextView "clockHours" exist in the configuration_activity.xml file.
So, my question is how to reproduce it? Or what is causing it?
Any help as usual much appreciated.
Regards Adam