Java Android静态类在第一次运行时为空

Java Android静态类在第一次运行时为空,java,android,initialization,static-classes,Java,Android,Initialization,Static Classes,我有一个包含所有静态成员的类,我需要使用这些静态成员在广泛的范围内保存数据,并在所有活动中使用它们。 现在,在应用程序第一次运行之后,一切都正常工作,但是第一次运行总是会崩溃。我有一个SplashScreen,它应该用默认值初始化类,但它总是空的。 以下是splash的电话: LocalSettings.LoadSettings(); 这是课堂。PS:设置变量是一个用于在本地数据库上保存数据的表。它具有与LocalSettings类相同的变量 公共类本地设置{ public LocalSett

我有一个包含所有静态成员的类,我需要使用这些静态成员在广泛的范围内保存数据,并在所有活动中使用它们。 现在,在应用程序第一次运行之后,一切都正常工作,但是第一次运行总是会崩溃。我有一个SplashScreen,它应该用默认值初始化类,但它总是空的。 以下是splash的电话:

LocalSettings.LoadSettings();
这是课堂。PS:设置变量是一个用于在本地数据库上保存数据的表。它具有与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
这是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;
    }
}

编辑:ps:我的问题不是例外,我的问题是第一个应用程序运行时的空静态类。

我看不到你在应用程序上下文中调用
LoadSettings()
。在你这样做之前,
periodovisualizato
将为空。“SplashScreen”是活动吗


在创建任何活动之前,您可能可以在
onCreate()
中调用应用程序类中的LocalSettings.LoadSettings()。

我看不到您在应用程序上下文中调用
LoadSettings()
的位置。在此之前,
periodovisualizato
将为空。“SplashScreen”是活动吗


也许您可以在
onCreate()中调用应用程序类中的LocalSettings.LoadSettings()
,在创建任何活动之前。

发现问题,我只是在设置实体确实存在的情况下初始化LocalSetting,如果不存在,我只是在创建一个新的设置。谢谢大家的回复。我刚刚用以下内容修改了该子句:

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

发现问题,我只是在设置实体确实存在的情况下初始化LocalSetting,如果不存在,我只是在创建一个新设置。无论如何,感谢所有人的回复。我只是用以下内容修改了该子句:

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

尝试
如果(settings.size()>0&&settings!=null)
@MD您可能想先进行空值检查。@MD感谢您的回复,我尝试过了(之前为null,之后为size)但是第一次运行时仍然为空。请发布stacktrace。@m0skit0好的,我有点知道如何修复空指针。.xD我的问题在静态类中,我不是这方面的专家。。不在例外情况下
if(settings.size()>0&&settings!=null)
@MD您可能想先做空检查。@MD感谢您的回复,我尝试过了(之前为空,之后为大小)但是第一次运行时仍然为空。请发布stacktrace。@m0skit0 wel,我有点知道如何修复空指针..xD我的问题是在静态类中,我不是这方面的专家..不在例外情况下我将在一段时间内尝试,只是一个问题:为什么第二次运行时不再显示空异常?好的,现在我在pc上。加载设置在Spl中ashScreen(wich是一项活动)…这就是为什么我没有得到错误…发现了问题..在检查设置是否存在时,如果没有,我只是创建了一个新的设置,但没有填充静态变量…所以第一次它们为空..我的badI将在一段时间后尝试,只是一个问题:为什么第二次运行时空异常不再显示?好的,现在我在pc上。加载ttings在SplashScreen中(这是一个活动)…这就是为什么我没有得到错误…发现问题..在检查设置是否存在时,如果没有,我只是创建了一个新设置,但没有填充静态变量…所以第一次它们为空..我的错误
    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());