java - 究竟是什么导致了这个 NullPointerException?

标签 java android nullpointerexception sharedpreferences android-sharedpreferences

我对 Android 开发还很陌生,目前正在开发一个应用程序,该应用程序应该在按下按钮时保存当前时间和日期,将其存储到 SharedPreferences 中,然后在按下不同的按钮时显示字符串。我让它工作了,但今天做了一些修补,现在我遇到了一个无法解决的 NullPointerException,即使在 Google 和 Stackoverflow 上花了大约 45 分钟尝试不同的代码 fragment 之后也是如此。任何比我更擅长这方面的人都可以告诉我我错过了什么吗?

相关代码如下:

public class GetTimeStamp extends AppCompatActivity {

    private String date;
    public void setDate (View view){
        DateFormat df = new SimpleDateFormat("dd.MM.yyy 'om' HH:mm");
        date = df.format(Calendar.getInstance().getTime());
    }
    public String getDate(){
        return date;
    }
        SharedPreferences prefs = this.getSharedPreferences("SharedPrefs",       Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = prefs.edit();
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_get_time_stamp);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fabSaveTimeStamp);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                setDate(view);
                editor.putString("storedDate", date);
                editor.commit();
                Toast.makeText(getBaseContext(), "blablabla", Toast.LENGTH_SHORT).show();
            }
        })
FloatingActionButton fab3 = (FloatingActionButton) findViewById(R.id.fabShowTimeStamp);
        fab3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //retrieve the date from SharedPreferences and store it to a local String
                String retrievedDate = prefs.getString("storedDate", null);
                if (retrievedDate!=null){
                    AlertDialog alertDialog = new AlertDialog.Builder(GetTimeStamp.this).create(); //Read Update
                    alertDialog.setTitle("");
                    alertDialog.setMessage("somemessage" + retrievedDate);
                    alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                        }
                    });
                    alertDialog.show();
                }else {
                    //create an alert dialog explaining to the user that no date has been saved yet
                    AlertDialog alertDialog = new AlertDialog.Builder(GetTimeStamp.this).create(); //Read Update
                    alertDialog.setTitle("Error");
                    alertDialog.setMessage("errorexplanation");
                    alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                        }
                    });
                    alertDialog.show();
               }
            }
        });  

以下是错误:

02-08 22:49:36.142 19735-19735/? W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41ed7ce0)
02-08 22:49:36.152 19735-19735/? E/AndroidRuntime: FATAL EXCEPTION: main
   Process: com.example.user.appname, PID: 19735
   java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.user.appname/com.example.user.appname.GetTimeStamp}: java.lang.NullPointerException
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2131)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2264)
       at android.app.ActivityThread.access$800(ActivityThread.java:144)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:136)
       at android.app.ActivityThread.main(ActivityThread.java:5139)
       at java.lang.reflect.Method.invokeNative(Native Method)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612)
       at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.NullPointerException
       at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:173)
       at com.example.user.appname.GetTimeStamp.<init>(GetTimeStamp.java:36)
       at java.lang.Class.newInstanceImpl(Native Method)
       at java.lang.Class.newInstance(Class.java:1208)
       at android.app.Instrumentation.newActivity(Instrumentation.java:1061)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2122)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2264) 
       at android.app.ActivityThread.access$800(ActivityThread.java:144) 
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205) 
       at android.os.Handler.dispatchMessage(Handler.java:102) 
       at android.os.Looper.loop(Looper.java:136) 
       at android.app.ActivityThread.main(ActivityThread.java:5139) 
       at java.lang.reflect.Method.invokeNative(Native Method) 
       at java.lang.reflect.Method.invoke(Method.java:515) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:796) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:612) 
       at dalvik.system.NativeStart.main(Native Method)   

最佳答案

在您被允许之前,您正尝试初始化以下类字段:

SharedPreferences prefs = this.getSharedPreferences("SharedPrefs",       Context.MODE_PRIVATE);

仅声明字段:

SharedPreferences prefs;

然后在您的 onCreate() 方法中分配它:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    prefs = getSharedPreferences("SharedPrefs", Context.MODE_PRIVATE);
    ...
}

关于java - 究竟是什么导致了这个 NullPointerException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35280344/

相关文章:

java - 使用java的play框架中的Kafka Consumer

java - 如何将任何路径级别的扩展与 Spring MVC 匹配?

android - 如何从协程后台线程更新UI线程?

java - NullPointerException 堆栈跟踪在没有调试代理的情况下不可用

java - 除了 HashMap 之外,我还可以使用什么?

java - Gradle中的String.ReplaceAlli缺少要转义的字符

android - 在android中的每个选项卡旁边添加按钮

android - timePickerFragment 取消按钮上的监听器?

java - 为什么这个 for 循环会给我一个空指针异常?

Android:在 android.app.ActivityThread$PackageInfo$ServiceDispatcher.doConnected(ActivityThread.java:1012) 出现 NullPointerException