2

我创建了一个方法来查看用户输入的值是否是 typeint并且在liminfand之间limsup。它返回值,因此我可以将其用作菜单选项。字符串message告诉用户输入一些东西,而error告诉用户使用 和 之间的limunf数字limsup

我的问题是,例如,如果用户输入数字 10 并且liminf是 7 和limsupe 9,它的运行就像数字 10 在limsup和之间一样liminf

public static int readInput(String message, String error, int liminf, int limsup, Scanner rd){

    int option = 0;
    do {
        option = rd.nextInt();
        System.out.println(message);
        while (!rd.hasNextInt()) {
            System.out.println("Please enter the option");
            rd.nextLine();
        }
        option = rd.nextInt();
        canal.nextLine();
    } while (option > limsup || option < liminf);

    return option;
}
4

7 回答 7

2

当你检查输入时,你需要做两件事:

  1. 检查该值是否实际上是一个整数
  2. 检查值是否在范围内

要检查一个值是否为整数,您可以使用两种方法之一。使用hasNextInt在您的Scanner,或使用Integer.parseInt和捕捉NumberFormatExceptions。您在评论中说您不能使用第二个,所以我们将使用第一个。

你总是必须hasNextInt在你打电话之前打电话nextInt,所以你可以这样做:

int option = 0;
System.out.println(message);
System.out.println("Please enter the option");
while (!rd.hasNextInt()) {
    rd.nextLine(); // Clears the invalid input
    System.out.println("Please enter the option");
}
option = rd.nextInt();

这将循环直到用户输入一个int,然后它会得到那个int。请注意,在调用hasNextInt之前不调用nextInt会导致错误,如果您尝试输入非数字,则会在您当前的代码中发生这种情况。

接下来,您需要进行边界检查。如果我没记错的话,你希望它介于limsupand liminf, where之间。limsup > liminf我们需要确定允许这样做的条件。

之间是通过使用大于较低的数字和小于较高的数字来实现的。在这种情况下,就是option >= liminf && option <= limsup. 我们想在不是这个的时候循环,所以我们可以把整个东西包起来!()

int option = 0;
do {
    System.out.println(message);
    System.out.println("Please enter the option");
    while (!rd.hasNextInt()) {
        rd.nextLine(); // Clears the invalid input
        System.out.println("Please enter the option");
    }
    option = rd.nextInt();
} while (!(option >= liminf && option <= limsup));

return option;

我会让你弄清楚如何/在哪里打印错误消息,但这应该让你开始。

值得注意:

  • hasNextInt, nextInt,nextLine等都将等待用户输入,如果你使用Scanner rd = new Scanner(System.in);
  • 需要使用nextLine清除旧输入并强制用户输入新输入
  • 虽然德摩根定律很酷,但反转条件的最简单方法就是将其包装在!()
于 2012-11-28T16:13:59.357 回答
1

像这样改变你的条件while

while (option <= limsup && option >= liminf);

在您当前的条件下,当您拥有option = 10然后limsup = 9您的条件option > limsup将评估为true并且当您使用时||(或操作符),即使第二个条件评估为false整个表达式将评估为true

于 2012-11-28T16:08:30.037 回答
0

您可以检查输入是否为整数,Integer.parseInt(input);例如:-

 try {

  String s = "a";
  int i = Integer.parseInt(s);
  return true;
  }

catch(NumberFormatException nfe){return false;}

并改变条件,如: -

while (option <= limsup && option >= liminf);
于 2012-11-28T15:57:30.343 回答
0

您的检查错误(选项> limsup || 选项< liminf)查看选项> limsup,10 大于9,这就是您遇到此问题的原因

于 2012-11-28T16:28:54.387 回答
0

我相信,您readLine正在使它忽略下一个令牌(10)本身,因为它在hasNextInt检查单个令牌时读取整行。尝试如下简单(使用next并删除额外的rd.nextInt()作为循环中的第一条语句):

 do {
    System.out.println(message);
    while (!rd.hasNextInt()) {
        System.out.println("Please enter the option");
        rd.next();
    }
    //now the next token is int
    option = rd.nextInt();
    //flush the new line if any
    rd.nextLine();
} while (option > limsup || option < liminf);
于 2012-11-28T16:13:43.407 回答
0

以下是测试字符串是否为整数的方法:

private static boolean isInteger( String s ){

    try{
        Integer.parseInt(s);
        return true;
    catch( Exception e ){
        return false;
    }

}

但是,由于您使用的是 nextInt() 函数,因此这不是必需的,因为无论如何您只能以这种方式获得整数输入。

于 2012-11-28T16:01:56.247 回答
0
while ((option > limsup) || (option < liminf))
于 2012-11-28T16:06:01.313 回答