> 文档中心 > Android基础#15: Android菜鸟问题解决--Unable to start NullPointerException,控件找不到引起的空指针

Android基础#15: Android菜鸟问题解决--Unable to start NullPointerException,控件找不到引起的空指针

    编译Success,并不等于运行Success。-----箴言-----

内容简介:

本节再来看一个常见的崩溃问题。

问题描述:

在进行Android应用程序开发时,经常遇到“Unable to start activity”,“on a null object reference”,“java.lang.NullPointerException: Attempt to invoke virtual method”。

分析:

(1)直接看log错误信息,能够根据提示“FloatingActionButton.setOnClickListener(android.view.View$OnClickListener)' on a null object reference”,分析出可能是由于FloatingActionButton引起的空指针,FloatingActionButton没有被实例化。

(2)最后证明,的确如此,在findViewById中返回的是null。那么,通常的理解,作为一个控件,如果findViewById中找不到,编译就不通过的呀。为什么这里还编译过了呢。

(3)最后找的原因,findViewById的参数有问题,参数用的是另外一个layout xml文件的id。

具体说明如下:

解决方式:
在Activity中用findViewById的时候,参数的id一定是这个Activity所在的layout xml文件中定义的。

在本例中,正确的代码是:

MainActivity中:

 FloatingActionButton fab = findViewById(R.id.fab);

 

这个具体事例相关代码如下:

MainActivity

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = findViewById(R.id.fab2); fab.setOnClickListener(new View.OnClickListener() {     @Override     public void onClick(View view) {  Snackbar.make(view, "进入到SubFrameActivity", Snackbar.LENGTH_LONG)   .setAction("Action", null).show();  startActivity(new Intent(MainActivity.this, SubFrameActivity.class));     } });    }...}

对应的layou xml中“FloatingActionButton”的声明:

注意:这里的“FloatingActionButton fab = findViewById(R.id.fab2);” 和xml中的“android:id="@+id/fab"”。

下面高能:为什么还能编译通过?

因为,在项目中,还定义了另外一个laout xml,代码如下:

 

在这里,有“

android:id="@+id/fab2"的声明,

所以,MainAcitivy能够找到一个名为“fab2”的资源id,就可以编译通过了。

 

注:确保你使用的对象,能够正确被实例化。


 

风车动漫