5

TCPServerのメソッドを書いていました。私は以下のようなコードを書きました:

    // thread run
protected void threadRun(){
    // continue running. don't stop
    while(true){
        try{
            try{
            }
            catch(Exception e1){
                try{
                } catch(Exception e2){}
                finally{
                    // skip
                    continue;
                }
            }
        }
        catch(Exception e3){
        }
    }
}

コンテンツは重要ではありません。クライアントなどを受け入れるためのコードがありましたが、詳細ではないことを確認するためにそれらを削除しました。とにかく、私がこのコードをコンパイルしようとすると、コンパイラはそのcontinue行について次のように言います。

Error: continue is not inside a loop

多分私はそれが間違っていることを知っていると思うことによって、私は以下に見られるようにJavaで完全に同じコードを書きました:

class test{
public static void main(String[] args){
    while(true){
        try{
            try{
            }
            catch(Exception e1){
                try{
                } catch(Exception e2){}
                finally{
                    continue;
                }
            }

        }
        catch(Exception e3){
        }
    }
}
}

予想通り、Javaコンパイラはエラーメッセージを表示せず、正常にコンパイルされます。問題は正確に何である可能性がありますか?

4

1 に答える 1

2

どうやら、continue(と)はブロックbreakから抜け出すことはできません。finallyこれをコンパイルする:

void run() {
loop:
    while (true) {
        try {}
        catch (Exception e) {}
        finally {
            continue loop;
        }
    }
}

これが表示されます(ラベルを省略すると、発生したのと同じエラーが発生します):

Error: cannot continue out of finally block

この制限の正当性や説明はまだ見つかりません(編集:以下のラチェットフリークのコメントを参照してください)。ただし、これが非常に一般的なユースケースであるとは想像できません。あなたはおそらく他のオプションを見たいと思うでしょう。

于 2013-01-06T20:07:39.840 に答える