我知道这不是一个严肃的问题(我的代码并不完美......)但是我想知道为什么在字段初始化之后,作为参数传递给方法,字段有一个空指针(空)?
public class MainActivity extends ActionBarActivity{
private ProgressDialog prdialog;
ProgressDialog prepareDialog(ProgressDialog pr){
if (pr==null){
pr=new ProgressDialog(this);
}
pr.setTitle(R.string.Download);
pr.setCanceledOnTouchOutside(false);
pr.setCancelable(false);
pr.setMessage(getString(R.string.Wait_));
return pr;
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
prepareDialog(prdialog).show();
//do some operations
prdialog.dismiss();//here my app is crashes because prdialog=null
}
}
答案 0 :(得分:2)
Java仅对参数使用pass-by-value。见Is Java "pass-by-reference" or "pass-by-value"?
这意味着该行
prepareDialog(prdialog).show();
不更新prdialog
的值(虽然它确实产生了结果,但您也没有将其分配给prdialog
成员)。因此,它以后是空的。你想做的可能是:
ProgressDialog prepareDialog() {
ProgressDialog pr = new ProgressDialog(this);
pr.setTitle(R.string.Download);
pr.setCanceledOnTouchOutside(false);
pr.setCancelable(false);
pr.setMessage(getString(R.string.Wait_));
return pr;
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
prdialog = prepareDialog();
prdialog.show();
//do some operations
prdialog.dismiss();
}
另一种解决方案(如果你想多次调用prepareDialog()
,但重用对话而不是创建一个新对话框),那就是:
void prepareDialog() {
if (prDialog == null)
prDialog = new ProgressDialog(this);
prDialog.setTitle(R.string.Download);
prDialog.setCanceledOnTouchOutside(false);
prDialog.setCancelable(false);
prDialog.setMessage(getString(R.string.Wait_));
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
prepareDialog();
prdialog.show();
//do some operations
prdialog.dismiss();
}
答案 1 :(得分:0)
您的调用**prepareDialog(prdialog).show();**
会传递您的**prdialog**
对象的引用,但该方法会返回您忽略的完全构造的对象。由于java只传递值(引用的值在这里传递),你需要保留返回对象的引用。
你必须做prdialog = prepareDialog(prdialog);
之类的事情。之后,您的prdialog对象将完全构建供您使用。