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 块中),它不知道之后会发生什么。

我尝试使用标签,中断,继续,但这不起作用。

我尝试使用内部类(执行 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

您可以在标签前面的块周围添加一个虚拟循环,并使用带标签的 break 作为 goto 的等效项:

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 回答