当前位置: 代码迷 >> Android >> 关于Android空指针错误的一个有关问题
  详细解决方案

关于Android空指针错误的一个有关问题

热度:49   发布时间:2016-04-28 01:09:00.0
关于Android空指针异常的一个问题
我写了一个有两个按钮的布局,然后主方法如下:
public class MainActivity extends ActionBarActivity {
    private Button button1 = (Button) findViewById(R.id.button);
    private Button button2 = (Button) findViewById(R.id.button2);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
}

这样写就报错了。java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.Window.findViewById(int)' on a null object reference
但是我改成这样之后又可以运行了,,现在还是有点不太清楚为什么要这样改。
public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Button button1 = (Button) findViewById(R.id.button);
        Button button2 = (Button) findViewById(R.id.button2);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
}

我觉得第一种写法更好啊,,但是怎么会报错呢?求大家指教。能解读下这个异常更好
------解决思路----------------------
没加入布局文件就初始化,肯定出错啊
------解决思路----------------------
一般要先setContentView再初始化控件
------解决思路----------------------
第一种你只能是先声明一个变量,并不能直接找到它。
------解决思路----------------------
在oncreate时 你才去设置当前页面的布局 setContentView(R.layout.activity_main); 这句 然后 findViewById 是根据当前页面去找的你在申明的时候还没有设置布局,当然就找不到了,也就出错了。
------解决思路----------------------
楼上的都说得很清楚了。
我更习惯的写法是
public class MainActivity extends ActionBarActivity {
    private Button button1 ;
    private Button button2;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button1 = (Button) findViewById(R.id.button);
        button2 =  = (Button) findViewById(R.id.button2);
}
------解决思路----------------------
在 onCreate(Bundle savedInstanceState) 方法执行之前,还没有加载布局,所以找不到指定的按钮。

------解决思路----------------------
加载完布局后,在布局中findview。布局要是没有加载,view就不存在了。
 super.onCreate(savedInstanceState);
Button button1 = (Button) findViewById(R.id.button);
 Button button2 = (Button) findViewById(R.id.button2);
      
  相关解决方案