替代Java中的goto语句

时间:2015-02-24 02:48:33

标签: java goto

好的,所以我确定这个问题已经被打死了,但我仍然找不到我的项目需要的答案。

我正在努力在java中构建一个赌场游戏套件(我110%肯定有更好,更简单的语言,但我现在正在学习java,我想用java编写代码实践。) 我的问题是我无法弄清楚如何构建我的代码。我习惯使用goto语句(我开始学习小基础编码)。例如:

import java.util.*;

public class CasinoGames
{
  public static void main(String[] args)
  {
    Scanner keys = new Scanner(System.in);
    sopln("Hello, and welcome to Casino Games!");
    sopln("Would you like to login, register, or play as a guest?");
    char token = keys.nextLine().toLowerCase().charAt(0);
    randomlabelhere:
    if (token == "l")
      User.login();
    else if (token == "r")
      User.register();
    else if (token == "g")
      User.guestLogin();
    else
      sopln("Invalid Choice, please try again!");
      goto somerandomlabel

我知道这不会编译,所以请不要提及。我知道我可以使用do-while循环,但如果我想要选择执行goto,我还有哪些替代方案?

5 个答案:

答案 0 :(得分:7)

此外,token == "l"不是String比较在Java中的工作方式,您希望更像"l".equals(token)

此外,tokenchar的类型,因此它应该更像token == '1',但您可以使用String并使用{{1} },但您需要测试token.trim().startsWith("1")结果

答案 1 :(得分:2)

Java与goto最接近的是breakcontinue的标签。 Goto已经considered harmful的时间比Java更长,因此Java没有goto实现( gotoreserved word所以你不能添加一个)。最后,由于tokenchar,您应该与char文字进行比较,例如

while(true) {
  if (token == 'l')
    User.login();
  else if (token == 'r')
    User.register();
  else if (token == 'g')
    User.guestLogin();
  else {
    sopln("Invalid Choice, please try again!");
    continue;
  }
  break;
}

答案 2 :(得分:2)

如果你愿意,你可以采取goto下的所有内容,并使其成为自己的方法。假设您想要goto startInteraction,那么您可以这样做:

void startInteraction(){
    //everything below your "randomlabelhere:" would go in this method
}

然后在您想要触发时调用startInteraction()

不同之处在于,goto不会返回到调用它的位置,而此方法会。如果您在调用return;后面的行中使用startInteraction(),则可以模拟该功能,以便代码不会继续执行方法调用。

答案 3 :(得分:1)

这是你可以做到的一种方式:

import java.util.*;

public class CasinoGames
{
  public static void main(String[] args)
  {
    Scanner keys = new Scanner(System.in);
    sopln("Hello, and welcome to Casino Games!");
    sopln("Would you like to login, register, or play as a guest?");
    while (true) {
      char token = keys.nextLine().toLowerCase().charAt(0);
      if (token == 'l') {
        User.login();
        break;
      }
      else if (token == 'r') {
        User.register();
        break;
      }
      else if (token == 'g') {
        User.guestLogin();
        break;
      }
      else {
        sopln("Invalid Choice, please try again!");
      }
    }
  }
}

答案 4 :(得分:0)

import java.util.Scanner;

public class Casino {

public static void main(String[] args) {
    try (Scanner input = new Scanner(System.in)) {
        sopln("Hello, and welcome to Casino Games!");
        sopln("Would you like to login, register, or play as a guest?");
        while (true) {
            char token = input.next().toLowerCase().charAt(0);
            if (token == 'l') {
                User.login();
                break;
            } else if (token == 'r') {
                User.register();
                break;
            } else if (token == 'g') {
                User.guestLogin();
                break;
            } else {
                sopln("Invalid Choice, please try again!");
            }
        }
    }
}

public static void sopln(String str) {
    System.out.println(str);
}

private static class User {
    static void login() {}

    static void register() {}

    static void guestLogin() {}
}
}

Scanner在Java 7+中实现AutoCloseable,因此我使用try-with-resources功能对其进行了管理。

注意:应向用户显示菜单,以便他们知道l,r和g代表什么。我知道这似乎很明显,但你会感到惊讶:-P

我还会为退出程序添加某种逃逸案例。

我正在考虑上一次使用goto语句,并且唯一想到的是MIPS程序集跳转操作。