嵌套Do循环并尝试捕获

时间:2016-04-21 10:01:51

标签: java

我正在创建一个菜单,用户应该输入" 1"," 2"或" 3"取决于他想要的选项,但如果他输入了错误的内容,请说出#34; 4",他会收到一条错误消息,然后再次进入菜单。我应该在Try Catch中嵌套Do Loop,还是相反?谢谢!

4 个答案:

答案 0 :(得分: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 :(得分: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 thrownloop将继续,因为while循环的条件为true,因此您需要{ {1}} break循环,如果你在我的代码中注释的catch块中使用while,你可以继续循环

答案 2 :(得分: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;
}

答案 3 :(得分: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");
        }                       
    }
}

这只是为了表明这个想法。代码未经测试。

一般情况下,当您发现自己创建一个条件或开关,对于您将来添加的每个用例都需要一个新的段时,通常最好使用这样的模式将逻辑封装在单独的类中