首页 > 解决方案 > 为成员变量赋值时应用程序崩溃

问题描述

我想知道为什么当我声明一个成员变量并为其分配一个将其与按钮链接的值时,应用程序不断崩溃。但是,当我在没有值的情况下声明它并在 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();

            }
        });
}

标签: javaandroidfunctionclass

解决方案


除非您findViewById()实际将布局设置为Activity. 您的应用程序将崩溃,因为当首先创建类时,没有ButtonID 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);
}

推荐阅读