尽管没有更改任何内容,但简单的应用程序崩溃

Simple app crashes despite changing nothing

提问人:Nathan 提问时间:1/6/2021 最后编辑:Mark RotteveelNathan 更新时间:1/9/2021 访问量:67

问:

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

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

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

我了解什么是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));
            }
        });
    }

}

变量.java :

package com.nut.calendar;

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

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

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

Logcat 中的错误说:

原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()”

我真的很感激任何意见!

下面是整个堆栈跟踪: 错误

java android-studio 错误处理 nullreferenceexception

评论

0赞 Stultuske 1/6/2021
这回答了你的问题吗?什么是 NullPointerException,如何修复它?
0赞 ChristianB 1/6/2021
通常,Nullpointer 是最容易修复的。请向我们展示整个堆栈跟踪,因为它将指向指向 nullpointer 的函数。
0赞 Nathan 1/6/2021
啊,我已经看过这个了。我不确定我的情况在寻找什么,但谢谢!
0赞 Nathan 1/6/2021
@ChristianB当然
1赞 Sinner of the System 1/6/2021
findViewById如果在调用之前调用它,将返回 null。所以“nutButton”和“nutNum”是空的setContentView

答:

2赞 Nemo 1/6/2021 #1

如果您查看 Android 应用程序生命周期,您就会明白为什么会出现此错误。当您启动应用程序时,Android 将以特定方式运行这些方法,您需要调用 after,因为它设置了您的方法,并且需要设置它才能实际找到任何方法。AppCompatActivityfindViewByIdsetContentView(R.layout.activity_main);setContentViewviewsfindViewByIdview

0赞 ahmad bajwa 1/6/2021 #2

findViewById 如果在调用 setContentView 之前调用它,它将返回 null。所以 “nutButton” 和 “nutNum” 为 null。 在这里,我修复了代码复制。

    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));
                }
            });
        }
    
    }