1

私は現在、テキストブックからプロジェクトに取り組んでおり、while ループにあいまいな問題がありました。テキストブックのコードは次のとおりです。

while(getImage().getWidth(applet) <= 0);
double x = applet.getSize().width/2 - width()/2;
double y = applet.getSize().height/2 - height()/2;
at = AffineTransform.getTranslateInstance(x, y);

最後にセミコロンを付けて宣言された while ループを見たことがないので、コードを標準であると解釈しました。

while(getImage().getWidth(applet) <= 0) {
    double x = applet.getSize().width/2 - width()/2;
    double y = applet.getSize().height/2 - height()/2;
    at = AffineTransform.getTranslateInstance(x, y);
}

誰かが2つの違いを説明できますか? コードを最初のように変更したところ、プログラムは問題なく動作しましたが、違いがわかりません。

4

5 に答える 5

4

セミコロンは空のステートメントです。ループの継続条件の評価に副作用がある場合に使用できます。whileループは、完了時にループ条件を無効にする、または永久に実行される一連の副作用を生成します。

たとえば、getImage()呼び出すたびに新しい画像を取得する場合、返された画像の幅が になるまでループが続きます<= 0

while以下は、ループを使用aして文字列内の最初の文字を検索する簡単な例です。

int pos = 0;
String s = "quick brown fox jumps over the lazy dog";
while (i != s.length() && s.charAt(i++) != 'a')
    ;

このようなコードを読むと混乱する可能性があるため、セミコロンを別の行に配置し、ループ ステートメントとしてインデントするのが一般的です。

于 2012-07-15T14:55:22.790 に答える
2

あなたの変更により、コードのロジックが変更されました。の考え方はwhile(getImage().getWidth(applet) <= 0);、アプレットの幅のサイズが >0 になるまで待つことです。その後、残りのコードが続行されます。(別のプロセスがアプレットを初期化するのを待つ場合があります)。

于 2012-07-15T14:58:33.817 に答える
1

これは意図的なものです。画像はバックグラウンド プロセスで非同期に読み込まれ、実質的にgetWidth(ImageObserver)は画像が既に幅を指定できるかどうかを尋ねます。これは単にいわゆるビジー ループです。最初の getWidth は -1 です。

これは不適切なコーディング スタイルであり、getHeigth がまだ完全に読み取られていない場所でも getWidth を知ることができます。

これは、インターネット接続が遅い Java の最初の期間に起因します。

ImageObserverコールバックを使用することをお勧めします。

于 2012-07-15T15:00:00.307 に答える
0

セミコロンは、最初の例の while ループの終わりです。このような単一行のループがあると便利な場合もありますが、よくある間違いでもあります。

意図的なものである場合、このコードは別のスレッドが問題のアプレットの幅を変更するのを待っている可能性があります。これは、そのようなことを行うための優れた方法ではありません。

于 2012-07-15T14:56:09.840 に答える
0

無限ループです。タイプミスかどうかわからないので、あなたと同じように書きます。

これは、エラーをキャッチするかどうかを確認するためのテストだと思います。おめでとうございます!

参照: http://users.csc.calpoly.edu/~jdalbey/SWE/JavaPitfalls.html

于 2012-07-15T14:58:20.493 に答える