2

次のような Java コードがあるとします。

public class MyClass {
    public static Object doSmthg(Object A,Object B){
        if(smthg){ //if is given has an example, it can be any thing else
            doSmthg;
            GOTO label;
        }
        doSmthg;

        label;
        dosmthg1(modifying A and B);
        return an Object;
    }
}

コードを自動的に生成しています。ジェネレーターが goto を生成する瞬間に到着したとき (かつ、それが if ブロックにあることを認識していない場合)、その後どうなるかはわかりません。

labels,break,continue を使用してみましたが、これは機能しません。

内部クラス (dosmthg1 を実行) を使用しようとしましたが、A と B を final と宣言する必要があります。問題は、A と B を変更する必要があることです。

他に解決策がない場合は、ジェネレーターでより多くの知識を広める必要があります。しかし、私はより簡単な解決策を好むでしょう。

何か案は ?

前もって感謝します。

4

3 に答える 3

1
public static Object doSmthg(Object A,Object B){
    try {
    if(smthg){ //if is given has an example, it can be any thing else
        doSmthg;
        throw new GotoException(1);
    }
    doSmthg;

    } catch (GotoException e) {
         e.decrementLevel();
        if (e.getLevel() > 0)
            throw e;
    }
    dosmthg1(modifying A and B);
    return an Object;
}

例外を指定して goto を実行することはできますが、正しい「ラベル」をターゲットにするには、例外メッセージをチェックするか、ネスト レベルを考慮する必要があります。

これが醜くないと思うかどうかはわかりません。

于 2012-05-07T10:58:21.523 に答える
1

ラベルの前のブロックの周りにダミー ループを追加し、goto と同等のラベル付き break を使用できます。

public static Object doSmthg(Object A,Object B){
    label:
    do { // Labeled dummy loop
        if(smthg){ //if is given has an example, it can be any thing else
            doSmthg;
            break label; // This brings you to the point after the labeled loop
        }
        doSmthg;
    } while (false); // This is not really a loop: it goes through only once
    dosmthg1(modifying A and B);
    return an Object;
}
于 2012-05-07T10:58:46.603 に答える
1

何かを飛び越えたい場合は、次のようにします。

A
if cond goto c;
B
c: C

あなたはこれを次のようにすることができます

while (true) {
    A
    if cond break;
    B
}
C
于 2012-05-07T11:00:22.987 に答える