使用'goto'从if移动到else

时间:2017-04-01 14:47:16

标签: java string break goto continue

我知道java中没有goto,但是我问一般来说,如果有goto的方法,则if if else 例如:

public void decToAsci(String decimal) {
    String nb = "";
    int number;
    for (int i = 0; i < decimal.length(); i++) {
        Character c = decimal.charAt(i);
        if (!c.equals(' ')) {
            nb += decimal.charAt(i);
            if (i == decimal.length() - 1)
                //here i want to jump to else
                // i can do it like this :
                // System.out.print( (char) Integer.parseInt(nb) + " ");
                // but i repeat code in else here ..i just want to jump to else 
        } else {
            number = Integer.parseInt(nb);
            System.out.print((char) number + " ");
            nb = "";
            number = 0;
        }
    }
}

我试试这个:

if (!c.equals(' ')) {
    nb += decimal.charAt(i);
    if (i == decimal.length() - 1) continue label;
} else {
    label: the code in else
}

但没有奏效,也没有使用break标签。我明白继续,休息。是否在儿子和父母之间使用? :

label:
for(int i=0 ; i<n ; i++)
    if (cond) break label;

我问一个方法可以从if跳到其他(2个儿子)

(不是儿子和父母,而是在2个儿子之间跳跃)

我认为即使在c和c ++ 4示例中使用goto,我们也无法做到这一点

3 个答案:

答案 0 :(得分:1)

任何使用“goto like”行为的东西都是个坏主意。人们普遍认为,与坚持“结构化编程”控制结构相比,类似goto的控制结构导致代码更难以阅读/维护。

以下是(IMO)解决问题的两个“正确方法”:

方法#1 - 重新排列逻辑

public void decToAsci(String decimal) {
    String nb = "";
    for (int i = 0; i < decimal.length(); i++) {
        Character c = decimal.charAt(i);
        if (!c.equals(' ')) {
            nb += decimal.charAt(i);
        }
        if (c.equals(' ') || i == decimal.length() - 1) {
            int number = Integer.parseInt(nb);
            System.out.print((char) number + " ");
            nb = "";
        }
    }
}

(如果c.equals(' ')很昂贵,你可以使用一个临时变量来避免重新计算它。在这种情况下,它很便宜,并且可能会被JIT编译器内联并进一步优化。)

方法#2 - 将重构代码转换为methid

public void decToAsci(String decimal) {
    String nb = "";
    for (int i = 0; i < decimal.length(); i++) {
        Character c = decimal.charAt(i);
        if (!c.equals(' ')) {
            nb += decimal.charAt(i);
            if (i == decimal.length() - 1)
                nb = processAsInt(nb);
        } else {
            nb = processAsInt(nb);
        }
    }
}

public String processInt(String nb) {
    int number = Integer.parseInt(nb);
    System.out.print((char) number + " ");
    return "";
}

在这种情况下,第一种方法提供了更好的代码。 (IMO)

答案 1 :(得分:0)

Java没有goto。但是,如果我理解你,你可以使用switch,默认行为是 fall-through ,所以像

int number;
for(int i=0 ; i<decimal.length() ; i++ )
{
    Character c = decimal.charAt(i);
    switch (c) {
    default: // <-- c is not ' '
         nb += decimal.charAt(i);
         if (i != decimal.length() - 1) { 
             break; 
         }
         // i == decimal.length() - 1, fall-through  
    case ' ': // <-- c is ' ', or it fell through
        number = Integer.parseInt(nb);
        System.out.print( (char) number + " ");
        nb = "";
        number = 0;
    }
}

答案 2 :(得分:0)

我认为你没有正确地认为这一点。 if-else语句的设计方式使您无法从if分支跳转到else分支。 if语句的重点是要明确&#34;如果这是真的,那就这样做,否则就这样做。&#34;试图通过使用肮脏的技巧来违反这一点只会导致维护问题。您的代码将变得非常难以理解。

为什么不找一个解决方法,而不是考虑如何打破if语句?你在这里做的只是读取由空格分隔的整数。如果你正在做什么,为什么不在循环之前在字符串的末尾添加' '字符?这将与条件i == decimal.length() - 1

达到相同的效果
decimal += " ";
String nb = "";
int number;
for (int i = 0; i < decimal.length(); i++) {
    ...

或者您可以使用Scanner

Scanner s = new Scanner(decimal);
while (s.hasNextInt())
    System.out.print(((char)s.nextInt()) + " ");