2016-04-21 3 views
3

Я создаю меню, в котором пользователь должен вводить «1», «2» или «3» в зависимости от того, какие параметры он хочет, но если он что-то неправильно наберет, допустим, «4», , он получит сообщение об ошибке и снова появится в меню. Должен ли я вставить Do Loop внутри Try Catch или наоборот? Благодаря!Nesting Do Loop and Try Catch

+1

Вместо этого вы можете использовать 'switch-case'! – user2004685

+1

Не используйте try/catch для нормального потока программы. Используйте его только для исключительных ситуаций. – Patrick

ответ

0

Здесь нет необходимости использовать петли.

Вы можете использовать if else if или просто использовать случаи switch.

switch (input) { 
    case 1: 
    // menu 1; 
    break; 
    case 2: 
    // menu 2; 
    break; 
    case 3: 
    // menu 3; 
    break; 
    default: 
    // error 
    break; 
} 
1

Вместо использования try-catch в цепи. Вместо этого вы можете использовать простой switch-case.

Вот фрагмент кода:

public static void main (String[] args) throws Exception { 
    Scanner in = new Scanner(System.in); 
    while(in.hasNext()) { 
     switch(in.nextInt()) { 
      case 1: System.out.println("1 Entered..."); break; 
      case 2: System.out.println("2 Entered..."); break; 
      case 3: System.out.println("3 Entered..."); break; 
      default: System.out.println("Invalid!"); 
     } 
    } 
} 

Вход:

1 
2 
5 

Выход:

1 Entered... 
2 Entered... 
Invalid! 
+1

Возможно, вы захотите включить выход из цикла, если будет сделан правильный выбор. – Tiz

+0

@ Tiz Да, он может поставить 'break' и выйти из цикла в любое время, когда захочет. – user2004685

1
int g =0; 
while(true) { 
    try { 
     System.out.print("Enter your guess: "); 
     g = input.nextInt(); 
     if(g<0){ 
     break; 
     } 

    } catch (Exception e) { 
     System.err.println("Not a valid input. Error :"); 
     //continue; 
    } 
} 

, если вы используете try catch block внутри while loop будьте осторожны exception will be thrown БТ loop будет продолжаться, так как условие в то время как цикл верно, так что вам нужно break цикл while и вы можете продолжить цикл, если вы используете continue; внутри блока улова, который я комментировал в своем коде

0

Это, как правило, лучше использовать объектную ориентацию для таких вещей, в первую очередь шаблон команды в сочетании с фабрикой.

public interface Command { 
    String name(); 
    void execute();   
} 

public class OptionOne implements Command { 
    public String name() { 
     return "1"; 
    } 
    public void execute() { 
     System.out.println("Executing option 1"); 
    } 
} 

// command classes OptionTwo and OptionThree omitted 

public class CommandFactory { 

    private static final Command[] commands = { 
     new OptionOne(), 
     new OptionTwo(), 
     new OptioneThree() 
    }; 

    public static Command getInstance(String input) {       
     for (Command command : commands) { 
      if (command.name().equals(input)) { 
       return command 
      } 
     } 
     throw new IllegalArgumentException("no command known for input: " + input); 
    } 
} 

public class Application { 

    public static void main(String[] args) { 
     String input = args[0].trim(); 
     try { 
      CommandFactory.getInstance(input).execute(); 
     } 
     catch(IllegalArgumentException e) { 
      // logged message 
      System.err.println(e.getMessage()); 
      // message for the user 
      System.out.println("Could not handle input"); 
     }      
    } 
} 

Это просто, чтобы показать эту идею. Код не проверен.

В общем, когда вы обнаруживаете, что создаете условие или переключатель, для которого потребуется новый сегмент для каждого используемого варианта, который вы добавляете в будущем, обычно лучше использовать шаблон, такой как этот, чтобы инкапсулировать логику в отдельную классы.