代码如下:public class ProgressBarHandler extends Activity { private Button startBtnButton=null;
private ProgressBar bar=(ProgressBar) findViewById(R.id.bar);//null;
         // 问题就在这里

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
     System.out.println("onCreate------>");
     Log.e("ProgressBarHandler", "OUT");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
//        startBtnButton=(Button) findViewById(R.id.startBtn);
//        bar=(ProgressBar) findViewById(R.id.bar);
    }
}会报如下异常:
05-11 15:41:12.120: ERROR/AndroidRuntime(735): Caused by: java.lang.NullPointerException05-11 15:41:12.120: ERROR/AndroidRuntime(735):     at android.app.Activity.findViewById(Activity.java:1637)05-11 15:41:12.120: ERROR/AndroidRuntime(735):     at com.droid.leo.ProgressBarHandler.<init>(ProgressBarHandler.java:16)
05-11 15:41:12.120: ERROR/AndroidRuntime(735):     at java.lang.Class.newInstanceImpl(Native Method)05-11 15:41:12.120: ERROR/AndroidRuntime(735):     at java.lang.Class.newInstance(Class.java:1429)05-11 15:41:12.120: ERROR/AndroidRuntime(735):     at android.app.Instrumentation.newActivity(Instrumentation.java:1021)05-11 15:41:12.120: ERROR/AndroidRuntime(735):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
05-11 15:41:12.120: ERROR/AndroidRuntime(735):     ... 11 more
首先R.id.bar已经在xml中声明了,也知道,在执行onCreate中的setContentView(R.layout.main)之前
调用findViewById(R.id.bar)会返回null,找不到此对象。我疑惑的是findViewById(R.id.bar)返回null并赋给bar为何会导致运行期的空指针异常,我并没有调用
bar的任何方法啊,况且在相同的代码位置直接赋给null为何无异常
就像这样:
private ProgressBar bar=null;
初学java,很是不解,请多指教~~

解决方案 »

  1.   

    返回null复制给它其实无异常,因为你如果在oncreate中在SetContentView之前赋值虽然是null但也不会报异常,奇怪的是在成员函数中直接调用就有问题,具体原因不明,可能设计findViewByID的实现方式,有兴趣可以去查源码。
      

  2.   

    bar=(ProgressBar) findViewById(R.id.bar);获取他要在setContentView(R.layout.main)代码之下书写。
    也就是说你导入布局文件之后才能找到这个布局文件中的progressBar对象
      

  3.   

    2楼说的对,Activity 中findViewById一定要在setContentView 设置过相应布局之后
      

  4.   

    楼上正解 应该SetContentView弄控件
      

  5.   

    private ProgressBar bar=(ProgressBar) findViewById(R.id.bar)给错地方了
      

  6.   

    只有2#是在回答问题,其他的全是连问题是什么都没搞清楚,han~~~
      

  7.   

    (this).findViewById 难不成是 那个this有问题?
      

  8.   

        我同意7楼的意见。
         private ProgressBar bar=(ProgressBar) findViewById(R.id.bar);//null;
        执行的时候,貌似连this指针都没有就位,可能这会this还是NULL空指针。所以造成了空指针的异常。
      

  9.   


    是这样吗,报的空指针异常是this为null?
      

  10.   

        不好意思,很久没有看这个帖子。
         你把代码修改成如下,应该能够解决问题:
             
        private ProgressBar bar = null 
        @Override
        public void onCreate(Bundle savedInstanceState) {
            System.out.println("onCreate------>");
            Log.e("ProgressBarHandler", "OUT");
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            startBtnButton=(Button) findViewById(R.id.startBtn);
            bar=(ProgressBar) findViewById(R.id.bar);
              
        }    像你原先的写法 private ProgressBar bar=(ProgressBar) findViewById(R.id.bar);//null;这样写的话,在ProgressBarHandler被实例话以前,  private ProgressBar bar=(ProgressBar) findViewById(R.id.bar);//null;就已经执行到了。这时候,this指针应该还没有就位。
         只有从构造函数开始才能使用this指针。不过即使不考虑this指针的问题,findViewById这个函数只有在setContentView函数执行之后才能调用的,否则返回的肯定是null。