Java 中 goto 语句的替代方法

Alternative to goto statement in Java

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

我正在 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 的选项,我有什么选择?

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

的东西

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

Java 最接近 goto 的是 breakcontinue 的标签。 Goto 已经 considered harmful for longer than Java has been a language, and consequently Java doesn't have a goto implementation (and goto is a reserved 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;
}

这是您可以做到的一种方法:

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!");
      }
    }
  }
}

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

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

然后随时调用 startInteraction() 触发它。

不同之处在于 goto 不会 return 到它被调用的地方,而这个方法会。如果您在调用 startInteraction() 之后的行中使用 return;,则可以模拟该功能,这样代码就不会在方法调用之后继续。

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汇编跳转操作。