【问题标题】:App crashes when sharedpreferencs called调用 sharedpreferencs 时应用程序崩溃
【发布时间】:2023-03-28 21:26:01
【问题描述】:

我正在使用 android studio,但在这里遇到了问题。 我正在尝试使用共享首选项调用首选项,但是当我到达该行时,应用程序崩溃了。 如果我正在正确阅读 logcat,因为共享首选项为空。

public class counter extends AppCompatActivity {
    int timer1 = 0;
    String sec= "0";
    CountDownTimer cTimer = null;
    SharedPreferences mPrefs = getSharedPreferences("cdtime", 0);
    int cdtime = mPrefs.getInt("cdtime", 300000);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_counter);

        cTimer = new CountDownTimer(cdtime, 1000){

            @Override
            public void onTick(long millisUntilFinished) {
                TextView v = (TextView) findViewById(R.id.textView);
                long min = ((millisUntilFinished/1000)/60);
                long secprime = ((millisUntilFinished-(min*60000))/1000);
                if(secprime>10){
                    sec = (""+secprime);
                }else {
                    sec = ("0" + secprime);
                }
            }
        }
    }
}

我已经包含了 logcat。 我试图通过添加来解决问题

if(cdtime=null){
    //action
}

但这会引发语法错误。我究竟做错了什么? 注意:我也尝试将代码移动到 on.Create 之后的 .super 之后 它抛出了同样的错误 值cdtime 用于设置计时器的时间,我试图将其设置在单独的“设置”活动中。

日志猫

32014-32014/com.example.user.medialert E/AndroidRuntime: 致命异常: main 进程:com.example.user.medialert,PID:32014 java.lang.RuntimeException:无法实例化活动 ComponentInfo{com.example.user.medialert/com.example.user.medialert.counter}: java.lang.NullPointerException:尝试调用虚拟方法'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' 在空对象引用上 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2515) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723) 在 android.app.ActivityThread.access$900(ActivityThread.java:172) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1422) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:145) 在 android.app.ActivityThread.main(ActivityThread.java:5832) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'android.content.SharedPreferences android.content.Context.getSharedPreferences(java.lang.String, int)' 在 android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:184) 在 com.example.user.medialert.counter.(counter.java:26) 在 java.lang.reflect.Constructor.newInstance(Native Method) 在 java.lang.Class.newInstance(Class.java:1650) 在 android.app.Instrumentation.newActivity(Instrumentation.java:1079) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2505) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723) 在 android.app.ActivityThread.access$900(ActivityThread.java:172) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1422) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:145) 在 android.app.ActivityThread.main(ActivityThread.java:5832) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 09-25 18:29:14.221 647-647/com.example.user.medialert E/Zygote: MountEmulatedStorage() 09-25 18:29:14.221 647-647/com.example.user.medialert E/Zygote: v2 09-25 18:29:14.231 647-647/com.example.user.medialert E/SELinux: [DEBUG] get_category: 变量 seinfo: 默认灵敏度: NULL, 类别: NULL

【问题讨论】:

    标签: sharedpreferences crash-reports


    【解决方案1】:

    可能的解决方案如下:

    //改变这个

    SharedPreferences mPrefs = getSharedPreferences("cdtime", 0);
    

    //用这个

    SharedPreferences mPrefs = this.getPreferences(Context.MODE_PRIVATE);
    

    如果它对您有任何改变,请告诉我。

    编辑:更新后你的新代码应该看起来像这样 -

    public class counter extends AppCompatActivity {
        int timer1 = 0;
        String sec= "0";
        CountDownTimer cTimer = null;
        SharedPreferences mPrefs;
        int cdtime;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_counter);
    
            mPrefs = this.getPreferences(Context.MODE_PRIVATE);
            cdtime = mPrefs.getInt("cdtime", 300000);
    
    
    
            cTimer = new CountDownTimer(cdtime, 1000){
    
                @Override
                public void onTick(long millisUntilFinished) {
                    TextView v = (TextView) findViewById(R.id.textView);
                    long min = ((millisUntilFinished/1000)/60);
                    long secprime = ((millisUntilFinished-(min*60000))/1000);
                    if(secprime>10){
                        sec = (""+secprime);
                    }else {
                        sec = ("0" + secprime);
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 此解决方案的原因是您没有引用任何共享的 prefs 文件并获得空点异常。如果您在项目中只使用一个共享首选项文件,那么上述解决方案应该可以工作。
    • if(cdtime == null){ //action } 这是 if 语句检查等于条件的正确语法。 但在您的情况下,没有必要这样做。由于问题在于 SharedPreferences 初始化。请先尝试更正。
    • 您应该在 onCreate 中编辑首选项和初始化,而不是在那之前。你也需要改变它。
    • 我不知道将模式设为私有是一个好主意,就像我提到的那样,值是在与此不同的活动中设置的。今晚我将更改代码,但如果您能解释为什么从代码中删除“cdtime”,因为这是我需要编辑的标签?感谢您到目前为止的回答
    • 您不必担心设置模式私有,因为它与 private int 等不同。这是来自谷歌文档的实际描述 MODE_PRIVATE:文件创建模式:默认模式,其中创建的文件只能由调用应用程序(或共享相同用户 ID 的所有应用程序)访问。 因此,您可以看到整个应用程序将访问该 shred prefs 文件。而且我从未说过您需要删除 'cdtime' 。我刚刚从 Shared Pref 初始化代码中删除了它,因为它是格式错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 2012-07-29
    相关资源
    最近更新 更多