Java Android在实例化SharedReferences时引发NullPointerException

Java Android在实例化SharedReferences时引发NullPointerException,java,android,android-studio,nullpointerexception,sharedpreferences,Java,Android,Android Studio,Nullpointerexception,Sharedpreferences,我是Android开发的新手,我正在尝试在我(目前为止)的活动中创建一个简单的SharedReferences。然而,每次尝试运行它时,我都会在运行时收到一个空指针异常,即使我在声明行上分配了变量。我的完整跟踪: java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{andyszoke.macrohub/andyszoke.macrohub.SetMacroManualActivity}: java.la

我是Android开发的新手,我正在尝试在我(目前为止)的活动中创建一个简单的
SharedReferences
。然而,每次尝试运行它时,我都会在运行时收到一个空指针异常,即使我在声明行上分配了变量。我的完整跟踪:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{andyszoke.macrohub/andyszoke.macrohub.SetMacroManualActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2988)
                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3242)
                                                       at android.app.ActivityThread.access$1000(ActivityThread.java:205)
                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1695)
                                                       at android.os.Handler.dispatchMessage(Handler.java:102)
                                                       at android.os.Looper.loop(Looper.java:145)
                                                       at android.app.ActivityThread.main(ActivityThread.java:6895)
                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                       at java.lang.reflect.Method.invoke(Method.java:372)
                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
                                                    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
                                                       at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:111)
                                                       at andyszoke.macrohub.SetMacroManualActivity.<init>(SetMacroManualActivity.java:17)
                                                       at java.lang.reflect.Constructor.newInstance(Native Method)
                                                       at java.lang.Class.newInstance(Class.java:1690)
                                                       at android.app.Instrumentation.newActivity(Instrumentation.java:1080)
                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2978)
                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3242) 
                                                       at android.app.ActivityThread.access$1000(ActivityThread.java:205) 
                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1695) 
                                                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                       at android.os.Looper.loop(Looper.java:145) 
                                                       at android.app.ActivityThread.main(ActivityThread.java:6895) 
                                                       at java.lang.reflect.Method.invoke(Native Method) 
                                                       at java.lang.reflect.Method.invoke(Method.java:372) 
                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 

异常在类的第三行抛出。我尝试了各种不同的声明组合,并查看了尽可能多的stackoverflow帖子,但没有任何东西可以解决这个问题。任何帮助都将不胜感激

设置共享首选项的代码在onCreate之前运行。对于所有正常用途,在onCreate之前只应分配变量。当您提到this.getSharedReferences时,单词“this”指的是活动,但onCreate尚未调用(因此活动尚未形成)。所以“this”被分配给一个空对象。这样就得到了NullPointerException

public class SetMacroManualActivity extends AppCompatActivity {
  private static final String TAG = "myMessage";
  private static final String MY_PREF = "MyPreferences";
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    // load the layout
    setContentView(R.layout.filters); 
    SharedPreferences prefs = getSharedPreferences(MY_PREF, MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();

模式_PRIVATE是通常使用的,根据需求还有其他模式。因此,请检查适合您的方法。

prefs
编辑器
初始化移动到
onCreate()
。这会导致程序中其他地方的加载和保存方法出错,而不是onCreate。简单地将SharedReferences和Editor对象作为参数传递是否可以接受?我还没有在任何教程或视频中看到这样做explanations@AndrewSzoke只需将初始化移动到
onCreate()
。把声明留在原来的地方。@MikeM。我想是这样的。或者至少我现在得到了不相关的异常,所以它正在编译程序。谢谢
public class SetMacroManualActivity extends AppCompatActivity {
  private static final String TAG = "myMessage";
  private static final String MY_PREF = "MyPreferences";
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    // load the layout
    setContentView(R.layout.filters); 
    SharedPreferences prefs = getSharedPreferences(MY_PREF, MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();