尽管什么都不做,简单的应用程序还是崩溃了

Simple app crashes despite changing nothing

我是 Java 和 Android Studio 的新手(每个都有 1 天的经验)。

我正在制作一个测试应用程序,您可以在其中点击核桃,每次点击一个计数器都会增加一个,非常简单。该应用程序 运行ning 非常好,但是,今天早上它停止 运行ning 正常,每当我尝试 运行 它时,该应用程序都会停止。

我已经尝试了一些事情并将其缩小到一行和一个错误,但我不确定该怎么做。

我明白 NullPointerException 是什么,但我不知道在这种情况下如何 修复 它。由于我是 IDE 和语言的新手,因此绝对欢迎任何有关代码中 任何内容 的建议!

该应用目前由 2 类 个组成:

MainActivity.java :

package com.nut.calendar;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity{
    //WIDGETS
    ImageButton nutButton = findViewById(R.id.nutButton);
    TextView nutNum = findViewById(R.id.nutsNum);


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

        nutButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Variables.nutCount += 1;
                nutNum.setText(String.valueOf(Variables.nutCount));
            }
        });
    }

}

Variables.java :

package com.nut.calendar;

public class Variables{
    public static int nutCount = 0;
}

错误指向'MainActivity.java'中的第12行:

ImageButton nutButton = findViewById(R.id.nutButton);

Logcat 中的错误表示:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference

如有任何意见,我将不胜感激!

这是整个堆栈跟踪: Error

如果您查看 Android 应用程序 lifecycle,您就会明白为什么会出现此错误。当您启动应用程序时,Android 将以特定方式 运行 AppCompatActivity 中的方法,您需要在 setContentView(R.layout.activity_main); 之后调用 findViewById 因为它是 setContentView 设置你的 viewsfindViewById 需要先设置它才能真正找到任何 view.

如果您在调用 setContentView 之前调用它,

findViewById 将 return 为空。所以“nutButton”和“nutNum”为空。 这里我修复代码复制那个。

    package com.nut.calendar;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ImageButton;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity{
        //WIDGETS
      TextView nutNum;
      ImageButton nutButton;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
         nutButton = findViewById(R.id.nutButton);
         nutNum = findViewById(R.id.nutsNum);
    
            nutButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Variables.nutCount += 1;
                    nutNum.setText(String.valueOf(Variables.nutCount));
                }
            });
        }
    
    }