提问人:Nathan 提问时间:1/6/2021 最后编辑:Mark RotteveelNathan 更新时间:1/9/2021 访问量:67
尽管没有更改任何内容,但简单的应用程序崩溃
Simple app crashes despite changing nothing
问:
我是 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()”
我真的很感激任何意见!
下面是整个堆栈跟踪: 错误
答:
如果您查看 Android 应用程序生命周期,您就会明白为什么会出现此错误。当您启动应用程序时,Android 将以特定方式运行这些方法,您需要调用 after,因为它设置了您的方法,并且需要设置它才能实际找到任何方法。AppCompatActivity
findViewById
setContentView(R.layout.activity_main);
setContentView
views
findViewById
view
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));
}
});
}
}
评论
findViewById
如果在调用之前调用它,将返回 null。所以“nutButton”和“nutNum”是空的setContentView