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 的选项,我有什么选择?
- 一个
for-loop
- 一个
while-loop
- 一个
do-while-loop
- 事实上,除了
goto
(恕我直言)
此外,token == "l"
不是 String
比较在 Java 中的工作方式,你想要更像 "l".equals(token)
的东西
此外,token
是 char
的一种,因此它应该更像 token == '1'
,但您可以使用 String
并使用 token.trim().startsWith("1")
,但您需要测试 null
结果
Java 最接近 goto
的是 break
和 continue
的标签。 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 所以你不能添加一个)。最后,由于 token
是 char
你应该与 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汇编跳转操作。
好的,我确定这个问题已经被打死了,但我仍然找不到我的项目需要的答案。
我正在 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 的选项,我有什么选择?
- 一个
for-loop
- 一个
while-loop
- 一个
do-while-loop
- 事实上,除了
goto
(恕我直言)
此外,token == "l"
不是 String
比较在 Java 中的工作方式,你想要更像 "l".equals(token)
此外,token
是 char
的一种,因此它应该更像 token == '1'
,但您可以使用 String
并使用 token.trim().startsWith("1")
,但您需要测试 null
结果
Java 最接近 goto
的是 break
和 continue
的标签。 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 所以你不能添加一个)。最后,由于 token
是 char
你应该与 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汇编跳转操作。