我写了一个有两个按钮的布局,然后主方法如下:
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);