1

I have a class with all static members which I need to use for saving my datas in a wide scope, using them in all activities. Now, all is working fine after the first run of the application, but this first time run always crushes. I have a SplashScreen which should initialize the class with default values but it is always null. Here is the call from splash:

LocalSettings.LoadSettings();

and here is the Class. PS: the SETTING variable is a table i used for saving datas on the local DB. It has same variables of LocalSettings class.

public class LocalSettings {

public LocalSettings(){}

private static Enums.TIPO_PERIODO periodoVisualizzato;
private static Calendar dataSpecificaPeriodoVisualizzazione;
private static Calendar dataInizioPeriodoVisualizzazione;
private static Calendar dataFinePeriodoVisualizzazione;
private static CATEGORIA categoriaSpecificaPeriodoVisualizzazione;


public static void LoadSettings(){
    List<SETTINGS> settings = SETTINGS.listAll(SETTINGS.class);
    if(settings == null || settings.isEmpty()){
        SETTINGS setting = new SETTINGS();
        setting.setPERIODOVISUALIZZATO(Enums.TIPO_PERIODO.SEMPRE);
        setting.setGIORNOINIZIOPERIODOVISUALIZZAZIONE(Calendar.getInstance());
        setting.setGIORNOFINEPERIODOVISUALIZZAZIONE(Calendar.getInstance());
        setting.setDATASPECIFICAPERIODOVISUALIZZAZIONE(Calendar.getInstance());
        setting.setCATEGORIASPECIFICAPERIODOVISUALIZZAZIONE(new CATEGORIA("", 0));
        setting.save();
    }else{
        SETTINGS setting = settings.get(0);
        setPeriodoVisualizzato(setting.getPERIODOVISUALIZZATO());
        setDataInizioPeriodoVisualizzazione(setting.getGIORNOINIZIOPERIODOVISUALIZZAZIONE());
        setDataFinePeriodoVisualizzazione(setting.getGIORNOFINEPERIODOVISUALIZZAZIONE());
        setDataSpecificaPeriodoVisualizzazione(setting.getDATASPECIFICAPERIODOVISUALIZZAZIONE());
        setCategoriaSpecificaPeriodoVisualizzazione(setting.getCATEGORIASPECIFICAPERIODOVISUALIZZAZIONE());
    }
}

public static void SaveSettings(){
    List<SETTINGS> settings = SETTINGS.listAll(SETTINGS.class);
    SETTINGS setting;
    if(settings == null || settings.isEmpty()){
        setting = new SETTINGS();
    }else{
        setting = settings.get(0);
    }
    setting.setPERIODOVISUALIZZATO(getPeriodoVisualizzato());
    setting.setGIORNOFINEPERIODOVISUALIZZAZIONE(getDataFinePeriodoVisualizzazione());
    setting.setGIORNOINIZIOPERIODOVISUALIZZAZIONE(getDataInizioPeriodoVisualizzazione());
    setting.setDATASPECIFICAPERIODOVISUALIZZAZIONE(getDataSpecificaPeriodoVisualizzazione());
    setting.setCATEGORIASPECIFICAPERIODOVISUALIZZAZIONE(getCategoriaSpecificaPeriodoVisualizzazione());
    setting.save();
}

public static void ResetSettings(){
    setPeriodoVisualizzato(Enums.TIPO_PERIODO.SEMPRE);
    setDataFinePeriodoVisualizzazione(Calendar.getInstance());
    setDataInizioPeriodoVisualizzazione(Calendar.getInstance());
    setDataSpecificaPeriodoVisualizzazione(Calendar.getInstance());
    setCategoriaSpecificaPeriodoVisualizzazione(new CATEGORIA("", 0));
}
//getters and setters below

I'm stuck here since some hours and even on the net I didn't find anything that solved my problem. Any help will be appreciated

EDIT: this is where i get the nullPointerException, in "HomePageActivity":

TIPO_PERIODO period = LocalSettings.getPeriodoVisualizzato();
String periodString = period.name();

this is TIPO_PERIODO enum:

public enum TIPO_PERIODO{
    GIORNO, MESE, ANNO, SEMPRE, PERIODO_PERSONALIZZATO, CATEGORIA;

    public static List<String> ListAll(){
        ArrayList<String> tipi = new ArrayList<>();
        for(TIPO_PERIODO tp : TIPO_PERIODO.values()){
            tipi.add(tp.name());
        }
        return tipi;
    }
}

and this is the full stack trace:

10-14 12:50:55.196 15902-15902/? E/AndroidRuntime: FATAL EXCEPTION: main
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime: Process: com.example.piermisley.Activities, PID: 15902
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.piermisley.Activities/com.example.piermisley.Activities.HomePageActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.piermisley.Classes.Enums$TIPO_PERIODO.name()' on a null object reference
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2356)
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2418)
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at android.app.ActivityThread.access$900(ActivityThread.java:154)
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5289)
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.piermisley.Classes.Enums$TIPO_PERIODO.name()' on a null object reference
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at com.example.piermisley.Activities.HomePageActivity.LoadList(HomePageActivity.java:100)
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at com.example.piermisley.Activities.HomePageActivity.LoadPageDatas(HomePageActivity.java:438)
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at com.example.piermisley.Activities.HomePageActivity.onCreate(HomePageActivity.java:80)
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at android.app.Activity.performCreate(Activity.java:5990)
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2309)
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2418) 
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at android.app.ActivityThread.access$900(ActivityThread.java:154) 
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) 
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102) 
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135) 
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5289) 
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372) 
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
10-14 12:50:55.196 15902-15902/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 

EDIT: ps: my problem is not the exception, my problem is the null static class on first app's run. :)

Pier Giorgio Misley
  • 5,305
  • 4
  • 27
  • 66

2 Answers2

0

I can't see where you call LoadSettings() in the context of your application. Until you do, periodoVisualizzato will be null. Is "SplashScreen" an activity?

Perhaps you can call LocalSettings.LoadSettings() in your Application class in onCreate(), before any Activities have been created.

ataulm
  • 15,195
  • 7
  • 50
  • 92
0

Found the problem, i was initializating the LocalSetting only if the SETTING entity did exist, if not i was only creating a new SETTING. thanks anyway all for replying. I just modified the clause with:

    SETTINGS setting;

    if(settings == null || settings.isEmpty()){
        setting = new SETTINGS();
        setting.setPERIODOVISUALIZZATO(Enums.TIPO_PERIODO.SEMPRE);
        setting.setGIORNOINIZIOPERIODOVISUALIZZAZIONE(Calendar.getInstance());
        setting.setGIORNOFINEPERIODOVISUALIZZAZIONE(Calendar.getInstance());
        setting.setDATASPECIFICAPERIODOVISUALIZZAZIONE(Calendar.getInstance());
        setting.setCATEGORIASPECIFICAPERIODOVISUALIZZAZIONE(new CATEGORIA("", 0));
        setting.save();
    }else {
        setting = settings.get(0);
    }
        setPeriodoVisualizzato(setting.getPERIODOVISUALIZZATO());
        setDataInizioPeriodoVisualizzazione(setting.getGIORNOINIZIOPERIODOVISUALIZZAZIONE());
        setDataFinePeriodoVisualizzazione(setting.getGIORNOFINEPERIODOVISUALIZZAZIONE());
        setDataSpecificaPeriodoVisualizzazione(setting.getDATASPECIFICAPERIODOVISUALIZZAZIONE());
        setCategoriaSpecificaPeriodoVisualizzazione(setting.getCATEGORIASPECIFICAPERIODOVISUALIZZAZIONE());
Pier Giorgio Misley
  • 5,305
  • 4
  • 27
  • 66