代码如下: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,很是不解,请多指教~~
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,很是不解,请多指教~~
也就是说你导入布局文件之后才能找到这个布局文件中的progressBar对象
private ProgressBar bar=(ProgressBar) findViewById(R.id.bar);//null;
执行的时候,貌似连this指针都没有就位,可能这会this还是NULL空指针。所以造成了空指针的异常。
是这样吗,报的空指针异常是this为null?
你把代码修改成如下,应该能够解决问题:
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。