9

私は多くのことを行うアンドロイドアプリを書いています。最近、より良い構造になるようにコードをリファクタリングしましたが、突然、非常に奇妙な問題が発生しました。

handleRequest(String str)
{
    boolean foo = executeCommand(str);
    this.publishProgress("FOO1: " + foo);

    if (foo == false);
    {
        this.publishProgress("FOO2: " + foo);
        sendString("Failed to execute: " + str);
    }

    this.publishProgress("FOO3: " + foo);
    sendEOM();
}

上記のコードはコマンドを実行し、コマンドが正しく実行された場合は「foo」を保存する必要があります。このコードは Android AsyncTask (スレッド) 内にあるため、'publishProgress' を使用してトーストを表示します。

デバッガーをめくってみましたが、FOO は true です。トーストは、FOO が全体を通して真であることも示しています。ただし、先に進んで IF ブロック内にジャンプし、それも実行します。これは今まで見たことがありません。Java の問題だと思います。関数「executeCommand」をステップ実行していましたが、return ステートメントもスキップしているようです。

仮想デバイスと実際のデバイスでコードを実行しましたが、どちらもこれを行います。

何か案は?私はここで完全に途方に暮れています。

4

6 に答える 6

22

あなたが言った

 if (foo == false);

セミコロンを削除します。

 if (foo == false) {//your code}
于 2012-07-17T15:42:52.190 に答える
9

セミコロンを削除します: if (foo == false);->if (foo == false)

于 2012-07-17T15:43:18.427 に答える
9

ifステートメントの後にセミコロンを置きます。

そうすれば、ifステートメントは単独で存在し、次のコード ブロックは常に実行されます。

次のようにコードを変更します。

handleRequest(String str) {
    boolean foo = executeCommand(str);
    this.publishProgress("FOO1: " + foo);

    if (foo == false) {
        this.publishProgress("FOO2: " + foo);
        sendString("Failed to execute: " + str);
    }

    this.publishProgress("FOO3: " + foo);
    sendEOM();
}

NB
ブロック開き中括弧を関数定義/ループ条件と同じ行に保持すると、この種の間違いの頻度が大幅に低下します、IMO.

于 2012-07-17T15:43:48.360 に答える
4

何もないだろう ";" if文の後のセミコロン。

したがって、if の代わり(foo == false);(foo == false){}

于 2012-07-17T15:55:53.770 に答える
4

if 文の後にセミコロン (;) を書くとそこで if 条件が終了します! if条件を書いた後、コードのブロックを開始する必要があります。

if(foo == false){

// block of Code

} //end of if condition
于 2013-08-20T21:08:05.910 に答える
1

この行がどのようにコンパイルされるかはわかりませんif (foo == false);が、明らかにそうです。他の人が言及しているように、行末のセミコロンを削除する必要があります。とともに ; つまり、foo が false の場合は何もしないということです。次に、プログラムは 2 つの中括弧の間の次のブロックに入ります。この種のタイプミスに対して警告するには、findbugs または PMD をインストールする必要があります。

于 2012-09-02T19:06:17.960 に答える