java - 为成员变量赋值时应用程序崩溃
问题描述
我想知道为什么当我声明一个成员变量并为其分配一个将其与按钮链接的值时,应用程序不断崩溃。但是,当我在没有值的情况下声明它并在 onCreate 方法中给它一个值时,应用程序运行得非常好。
在以下情况下崩溃:-
public class MainActivity extends AppCompatActivity {
Button buttonTrue = findViewById(R.id.buttonTrue);
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonTrue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "False", Toast.LENGTH_SHORT).show();
}
});
}
在以下情况下不会崩溃:-
public class MainActivity extends AppCompatActivity {
Button buttonTrue;
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonTrue = findViewById(R.id.buttonTrue);
buttonTrue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "False", Toast.LENGTH_SHORT).show();
}
});
}
解决方案
除非您findViewById()
实际将布局设置为Activity
. 您的应用程序将崩溃,因为当首先创建类时,没有Button
ID R.id.buttonTrue
,因为您没有设置布局。
你总是会得到NullPointerException
你正在做的事情。
按 ID 查找视图的正确方法是在它们在 Activity 视图层次结构中可用之后setContentView(R.layout.activity_main)
执行。
NullPointerException
如果您尝试在执行之前找到相同的视图,您将遇到相同的情况setContentView()
,即如果您尝试这样做。
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = findViewById(R.id.your_button);
//This will give NullPointerException as you're trying to find
//button before activity gets any layout to work with
setContentView(R.layout.activity_main);
}
推荐阅读
- java - 使用 MOA 将 SQL 表迁移到内存中
- python-3.x - 如何在 Python 中返回多个值作为列表的一部分
- caching - 如何减少微服务 Spring Boot 之间的 API 调用
- javascript - JavaScript IIFE 评估未定义
- c# - 如何在 C# 中将许多整数值更新回它们各自在数据库中的列
- java - 如何使用 java 扫描 DynamoDB 中的多个属性?
- solidity - Pancake router 测试 BSC 发布合约 gas 错误
- terraform-provider-azure - 用于不同环境的 Terraform.tf 参数化或模板
- python - 无法访问与数据规范化一起使用的 sns.histplot() 的图例
- ada - 使用 File_Type 作为记录组件?