【问题标题】:Error, Null Pointer Exception for SharedPreferencesSharedPreferences 的错误、空指针异常
【发布时间】:2016-04-28 02:36:48
【问题描述】:

因此,无论我尝试在这里和那里调整我的代码多少次,我都会不断收到相同的错误。我将发布与错误有关的每一点代码。

我不会包含不必要的代码,所以如果我的代码看起来不完整,那是因为我删掉了它以便人们更容易诊断问题!

头等舱

我写了!!!错误 !!!根据我的日志,在据说是错误原因的代码之后。

SharedPreferences sf;
SharedPreferences.Editor editor;

@Override
protected void onCreate(Bundle savedInstanceState) {
sf = getSharedPreferences("MyData", MODE_PRIVATE);
checkCookie();
}

//function for making sure there's data 
public void checkCookie() {
        editor = sf.edit();
        if (sf.getInt("cookies", -1) == -1) {
            editor.putInt("cookies", 0);
        }
    }
//function for retrieving amount of cookies
public int getCookies()
    {
        editor = sf.edit(); !!! Error here !!!
        int x = sf.getInt("cookies", 0);
        return x;
    }
//function for changing amount of cookies
public void changeCookies(int x)
    {
        editor = sf.edit();
        editor.putInt("cookies", x);
    }

二等

我放了!!!错误 !!!在给出的第二个错误处,基本上就是调用带有错误的函数。

//MyActivity is the first class
MyActivity mCookie = new MyActivity();

//function for adding cookies
public void cookieCalc(){
        if (Math.abs((5-(millis/1000))) <= 0.005)
            mCookie.changeCookies(100 * CB); ... much more similar code

//an if statement within a function which just calls the function getcookies and cookiecalc
if (loop == 2){
cookieCalc();
myText.setText("= " + mCookie.getCookies()); !!! this calls the function which gives error !!!
}

错误是 100%,因为 SharedPreferences 因为它与普通变量一起使用,但我需要保存变量并被告知这是一种非常简单的方法。如果这一切还不够,我无法向你解释,我会将我的整个代码粘贴到 gitHub 或其他查看平台上。

错误日志

04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke interface method 'android.content.SharedPreferences$Editor android.content.SharedPreferences.edit()' on a null object reference
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:     at app.z0nen.slidemenu.MyActivity.changeCookies(MyActivity.java:74)
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:     at app.z0nen.slidemenu.menu1_Fragment.cookieCalc(menu1_Fragment.java:75)
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:     at app.z0nen.slidemenu.menu1_Fragment$1.onClick(menu1_Fragment.java:148)
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:     at android.view.View.performClick(View.java:5242)
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:     at android.widget.TextView.performClick(TextView.java:10571)
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:21196)
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:145)
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:6938)
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

【问题讨论】:

  • Activity 类并不是所有东西的基类,你不能用new 实例化Activity 子类并让它正常工作。一方面,onCreate() 不会被调用,这似乎是您当前 NPE 的原因。
  • onCreate 在创建我的应用程序的主要功能上。我试图做 system.out.println 但我在我的代码中的任何地方都找不到它。我没有活动子类,我只是创建了一个空白构造函数并拥有它,因此它可以从中接收信息。
  • 您应该将 Context 传递给您的第二个班级,而不是创建非托管 Activity
  • MyActivity mCookie = new MyActivity();是在我的 fragment.java 上创建的。我不相信这会导致我崩溃。只有当我添加了偏好之后。我只是这样做纯粹是为了让我可以从一个班级到另一个班级交谈,因为这是我知道的唯一方法。

标签: java android nullpointerexception sharedpreferences


【解决方案1】:

你不应该自己创建活动实例!只有系统应该这样做。

如果您自己创建实例,则永远不会调用 onCreate,因为该实例不会经历标准的活动生命周期。

【讨论】:

  • 我对此有点困惑。因为我没有语法错误,而且它似乎可以与我的活动类正确通信。
  • 有没有办法检查它是否运行我的 onCreate?
  • 使用日志记录。但是,如果您自己创建活动实例,则不会调用 onCreate。那么它只是普通的java
  • 好的,所以我将所有内容都移动到我的片段类并删除了 MyActivity mCookie = new MyActivity();。我仍然收到相同的空指针异常错误。我也将 Context 添加到了我的 sharedPreferences 中,但它仍然给了我同样的错误。
  • 好的,官方修复了null错误。这是因为在我不得不写的 onCreateView 片段内部 - SharedPreferences sf = this.getActivity().getSharedPreferences("your_prefs", Activity.MODE_PRIVATE);
【解决方案2】:

不要自己新建实例。 onCreate 是 br

【讨论】:

  • onCreate 被覆盖
  • 嗨墨菲宾。您可以通过点击帖子下方的“edit”链接来更新您的答案。谢谢。
【解决方案3】:

解决了

SharedPreferences sf = this.getActivity().getSharedPreferences("your_prefs", Activity.MODE_PRIVATE);

因为它在一个片段类中,所以我必须添加 this.getActivity(),最后我还添加了 Activity.MODE_PRIVATE。我可能会收到空指针异常,因为它无法访问我的 Activity 类,因为片段扩展了其他东西?只是我的一个猜测,到目前为止它仍然无法按照我的意愿工作,但我防止了崩溃。 edit 它不起作用,因为我没有执行 editor.commit();保存更改。

【讨论】:

  • 这不是正确的解决方案。正如这里的每个人所指出的,您不应该自己实例化活动。
  • 我得到的错误是空指针异常。该活动是我所做的一件愚蠢的事情,但它并没有导致错误。当我的代码最终可以工作时,请不要只是说我的解决方案是错误的。我花了至少 20 个小时试图解决这个问题,我身体不好或不擅长编码这不仅仅是我懒惰。
猜你喜欢
  • 2015-08-28
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 2013-03-22
  • 2020-04-29
  • 2017-10-28
相关资源
最近更新 更多