Code Bye

关于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);
}

我觉得第一种写法更好啊,,但是怎么会报错呢?求大家指教。能解读下这个异常更好

5分
没加入布局文件就初始化,肯定出错啊
5分
一般要先setContentView再初始化控件
5分
第一种你只能是先声明一个变量,并不能直接找到它。
楼上说的对,我就打下酱油,看能不能混点分,
10分
在oncreate时 你才去设置当前页面的布局 setContentView(R.layout.activity_main); 这句 然后 findViewById 是根据当前页面去找的你在申明的时候还没有设置布局,当然就找不到了,也就出错了。
5分
楼上的都说得很清楚了。
我更习惯的写法是
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);
}

引用 7 楼 dai_jiawei 的回复:

楼上的都说得很清楚了。
我更习惯的写法是
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);
}

+1
应该是先指定布局

5分
在 onCreate(Bundle savedInstanceState) 方法执行之前,还没有加载布局,所以找不到指定的按钮。
楼上正解Q!!!!!!!!!!!!!!!!
5分
加载完布局后,在布局中findview。布局要是没有加载,view就不存在了。
 super.onCreate(savedInstanceState);
Button button1 = (Button) findViewById(R.id.button);
 Button button2 = (Button) findViewById(R.id.button2);
      
建议楼主还是先看看google的官方开发文档
建议去看java基础,先了解java的执行步骤
引用 2 楼 janloven 的回复:

没加入布局文件就初始化,肯定出错啊

懂了,谢谢各位

谢谢大家的解答。就是楼上说的要先用 setContentView(R.layout.activity_main)来加载View才能找到控件

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于Android空指针异常的一个问题