-1

次のコード (スニペット) でコンパイラ エラーが発生します。このコードが正しくないのはなぜですか? 解決策

protected Dialog onCreateDialog(int paramInt)
{
 switch (paramInt)
 {
 default:
 case 0:
 }
 for (Object localObject = null; ; localObject = this.dialog)
 {
  return localObject; // here problem cast
  this.dialog = new ProgressDialog(this);
  this.dialog.setMessage(getResources().getString(2131165201));
  this.dialog.setIndeterminate(true);
  this.dialog.setCancelable(false);
 }
}
4

3 に答える 3

2

returnステートメントの後に制御が次の直接ステートメントに到達することはないため、コードになるreturn前にステートメントがあります。これにより、コンパイル エラーが発生します。次のように順序を反転する必要があります。this.dialog = new ProgressDialog(this);unreachable

    for (Dialog localObject = null; ; localObject = this.dialog)
    {
       this.dialog = new ProgressDialog(this);
       return localObject;
     }

あなたのループが何をするかはわかりませんが、ループせず、最初の反復自体に戻るだけであることは確かです。また、ループのブロックに到達しないのでlocalObject残ります(return文のため、先に戻ります)。nullincrementfor

編集:コンパイル エラーを修正するために、return ステートメントを as の一番下に移動しますloop

    protected Dialog onCreateDialog(int paramInt)
    {
       switch (paramInt)
       {
         default:
         case 0:
       }
       for (Dialog localObject = null; ; localObject = this.dialog)
       {
          this.dialog = new ProgressDialog(this);
          this.dialog.setMessage(getResources().getString(2131165201));
          this.dialog.setIndeterminate(true);
          this.dialog.setCancelable(false);
          return localObject; // here problem cast
       }
      }

先に述べたように、内部forのステートメントのためにループがまったくループしないため、ループを使用する本当の理由はわかりません。return

于 2012-12-02T02:39:03.000 に答える
1

リターンの後にコードを持つことはできません (またはすべきではありません)。これは「デッド」または「到達不能」コードと呼ばれます。

于 2012-12-02T02:39:20.140 に答える
1
for (Object localObject = null; ; localObject = this.dialog) {
   return localObject;
   this.dialog = new ProgressDialog(this);
}

まず、null に設定された localObject を返しています。それが Null Pointer Exception を与えているかどうかはわかりませんが、怪しいようです。第 2 に、Yogendra が言ったようthis.dialog = new ProgressDialog(this);に、return ステートメントがデッド コードになると、プログラムは決してステートメントに到達しません。

于 2012-12-02T02:44:03.580 に答える