Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类的方法初始化后,类的字段为空_Java_Android_Progressdialog - Fatal编程技术网

Java 类的方法初始化后,类的字段为空

Java 类的方法初始化后,类的字段为空,java,android,progressdialog,Java,Android,Progressdialog,我知道这不是一个严肃的问题(我的代码也不完美…),但我想知道为什么在初始化字段(作为参数传递给方法)后,字段会有一个空指针(null) Java只对参数使用传递值。看 这意味着 prepareDialog(prdialog).show(); 不更新prdialog的值(尽管它确实产生了一个结果,但您也没有将其分配给prdialog成员)。因此,它稍后为空。您想做的可能是: ProgressDialog prepareDialog() { ProgressDialog pr =

我知道这不是一个严肃的问题(我的代码也不完美…),但我想知道为什么在初始化字段(作为参数传递给方法)后,字段会有一个空指针(null)


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();
}