Java 类的方法初始化后,类的字段为空
我知道这不是一个严肃的问题(我的代码也不完美…),但我想知道为什么在初始化字段(作为参数传递给方法)后,字段会有一个空指针(null)Java 类的方法初始化后,类的字段为空,java,android,progressdialog,Java,Android,Progressdialog,我知道这不是一个严肃的问题(我的代码也不完美…),但我想知道为什么在初始化字段(作为参数传递给方法)后,字段会有一个空指针(null) Java只对参数使用传递值。看 这意味着 prepareDialog(prdialog).show(); 不更新prdialog的值(尽管它确实产生了一个结果,但您也没有将其分配给prdialog成员)。因此,它稍后为空。您想做的可能是: ProgressDialog prepareDialog() { ProgressDialog pr =
Java只对参数使用传递值。看 这意味着
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();
}
您的呼叫
**prepareDialog(prdialog).show()**
传递**prdialog**
对象的引用,但该方法返回一个完全构造的对象,您可以忽略它。由于java只是传递值(此处传递的是引用的值),因此需要保留返回对象的引用
您必须执行类似于
prdialog=prepareDialog(prdialog)的操作代码>。之后,您的prdialog对象将完全构造以供您使用。您指的是哪个字段?您认为应该设置什么语句prdialog
?您没有为prdialog
分配任何内容。解决方案不太正确。我想他第一次是想让prepareDialog
创建一个新的ProgressDialog
,而您的解决方案每次都会创建一个新的。@ajb因为它是在onCreate()
中调用的,所以我认为没有必要这样做。但是,公平的一点,我会纠正这个例子。我一直认为java通过引用传递对象,就像C++一样。我们不知道它也没有被调用到别的地方。此外,在Android活动生命周期中,似乎可以对同一对象多次调用onCreate()
。@Vladislav按照答案顶部的链接进行操作。这将有助于解释问题。
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();
}