2015-02-24 2 views
0

ОК, поэтому я уверен, что этот вопрос был избит до смерти, но я все еще не могу найти ответ, который мне нужен для моего проекта.Альтернатива оператору goto в Java

Я работаю над созданием набора игр для игры в казино в java (я уверен, что для этого есть более простые и простые языки, но я изучаю 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, какие у меня альтернативы?

+4

Не пытайтесь создать Java-программу, используя базовую логику и структуру. Вместо этого изучите и используйте идеи ООП. В общем, отпустите вашу 'goto' и двигайтесь дальше. –

+3

@HovercraftFullOfEels Вы думаете о структурированном программировании, а не ООП. 'goto' не имеет ничего общего с ООП. – immibis

+0

Я предполагаю, что это примерно то же время: PI на самом деле планировал использовать do-while-loop, но просто хотел знать, было ли подобное заявление^_^@HovercraftFullOfEels –

ответ

2

Ближайшей вещь Java имеет значение goto - это метки для break и continue. Goto был considered harmful дольше, чем Java был языком, и, следовательно, Java не имеет реализации goto (иgoto - 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; 
} 
+0

AFAIK 'goto' - это зарезервированное слово именно в том случае, если они решили добавить его в один прекрасный день. – immibis

+0

Да, но если вы используете разрыв, то он пропускает этот помеченный блок, не так ли? Кроме того, continue можно использовать только в цикле^_^ –

+0

@immibis На самом деле, Jasmin (сборщик Java) включает в себя goto (потому что JVM имеет его с первого дня). –

7

Кроме того, token == "l" не как String сравнение работает в Java, вы хотите что-то большее, как "l".equals(token)

Кроме того, token является типом char так должно быть больше как token == '1', но вы могли бы уйти с использованием String и используя token.trim().startsWith("1"), но вы должны проверить на null результате

+0

Я понял это после того, как я разместил это, я действительно изменил его to:! token == 'l', который, по-моему, является сопоставлением символов. –

+1

@AustenClay Не совсем; это 'токен! = 'l'' или '! (токен ==' l ')'. – TNT

+0

@Dev вы действительно прочитали код в вопросе? – immibis

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

... Не компилируется ... – MadProgrammer

+0

Ну, пользователь и sopln не определены, но в остальном я думаю, что это должно ... – jacobm

+0

Теперь вы исправите сравнение между 'char' и' String';) – MadProgrammer

2

Если вы хотите, вы можете взять все, что будет под goto и сделать это своим методом. Допустим, вы хотели goto startInteraction, то вы можете сделать это:

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

, а затем вызвать startInteraction() в любое время вы хотите, чтобы вызвать это.

Разница в том, что goto не вернется туда, откуда он был вызван, в то время как этот метод будет. Эта функция может быть смоделирована, если вы использовали return; в строке, следующей за тем, где вы вызываете startInteraction(), чтобы код не продолжался после вызова метода.

+0

Исправлено, спасибо. –

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() {} 
} 
} 

Сканер реализует AutoCloseable в Java 7+, поэтому мне удалось использовать функцию try-with-resources.

Примечание: пользователю должно быть представлено меню, чтобы они знали, для чего предназначены l, r и g. Я знаю, что это кажется очевидным, но вы были бы удивлены: -P

Я бы также добавил какой-нибудь случайный случай для выхода из программы.

Я пытаюсь вспомнить последний раз, когда я использовал утверждение goto, и единственное, что приходит на ум, это операции перехода на MIPS-сборку.

Смежные вопросы