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,就可以编译通过了。
注:确保你使用的对象,能够正确被实例化。