Java - 连续检查输入是否为double

时间:2015-04-02 03:29:04

标签: java input

所以,我一直坚持这种方法,我正在努力。基本上,我需要接收输入的方法,检查它是否实际上是一个数字,然后看它是否在最大值和最小值之间。

我目前遇到的问题是当我要求用户输入新号码时,因为他们的输入是在0或大于1,000,000之前。当用户输入除数字以外的任何内容时,它会崩溃。有什么想法吗?

如果您决定告诉我如何使用Try / Catch语句修复它;你能告诉我它究竟是如何运作的吗?我不能100%确定这些是如何运作的!

代码已使用最新版本

进行了编辑
public static double inRange( Scanner scan, int min, int max ) {
    double Amount = 0.0;
    boolean isValid = false;

    while( isValid == false ) {
        if( scan.hasNextDouble() ) {
            Amount = scan.nextDouble();
            if( Amount > max ) {
                System.out.print( "Error: You cannot enter a number greater than $1,000,000. Try again: " );
            }
            else if( Amount < min ) {
                System.out.print( "Error: You cannot enter a negative number. Try again: " );
            }
            else {
                isValid = true;
                break;
            }
        }
        else {
            System.out.print( "Error: You must enter a number! Try again: " );
            scan.next();
        }
    }
    return Amount;
}

3 个答案:

答案 0 :(得分:0)

我认为错误存在于这些行中

if( scan.hasNextDouble() ) {
    ...
} else {
    System.out.print( "Error: You must enter a number! Try again: " );
    Amount = scan.nextDouble();  // problem is here, remove it!
}

如果扫描没有下一个双倍,它怎么能得到下一个双倍值?
此外,我认为这一行

Amount = scan.nextDouble();

应该改为

scan.next();

这些是我的代码,它们运行正常。

Scanner scan = new Scanner(System.in);
int min = 0;
int max = 1000000;
double Amount = 0.0;
boolean isValid = false;

while (isValid == false) {
    if (scan.hasNextDouble()) {
        Amount = scan.nextDouble();
        if (Amount > max) {
            System.out.print("Error: You cannot enter a number greater than $1,000,000. Try again: ");
        }
        else if (Amount < min) {
            System.out.print("Error: You cannot enter a negative number. Try again: ");
        }
        else {
            isValid = true;
                }
        }
    else {
        System.out.print("Error: You must enter a number! Try again: ");
        scan.next();
    }
}

答案 1 :(得分:0)

有很多方法可以解决这个问题以及一些改进代码的方法。

所以问题是Scanner返回一个字符串,并且你将该字符串赋值给double,当它类似于“23”或“2.4”但是不能与“Hello”一起使用时。 你做得很好,检查字符串是否在开头有一个双重

  if( scan.hasNextDouble() )

但是你不检查在else

中是否有双重
 else {
        System.out.print( "Error: You must enter a number! Try again: " );
        Amount = scan.nextDouble();
    }

因此,如果用户输入String之类的“Hello”,则表示扫描程序scan没有double,然后告诉用户但指定Amount等于输入的下一个东西没有检查它是否是双倍的。因此,如果再次输入“Hello”,它将崩溃。但是,如果你删除该行,就像有人建议你会得到一个无限循环,因为如果你看hasNextDouble scan.nextLine()它会说“扫描仪不会超过任何输入。”这意味着它将继续检查您输入的相同内容,除非您移动扫描仪。所以你需要做一些事情来移动扫描仪像System.out.print( "Error: You must enter a number! " + scan.nextLine() +" is not a number. Try again: " );那样返回刚输入的字符串,你可以使用它来给用户更多信息 Amount

因此,如果您输入“Hello”,它会告诉您Hello不是数字。

同样the documentation是变量的名称以小写字母开头,而不是amount使用System.out.print( "Error: You cannot enter a number greater than $" + max + ". Try again: " );。你也可以使你的代码更加模块化,因为现在尽管min和max是可以改变的变量,你总是告诉用户它们是1,000,000和0.所以如果我把max设为2然后输入3程序会告诉我

“错误:您输入的数字不能超过$ 1,000,000”

如果您将该行更改为 InputMismatchException 它会更有意义。

是的,您可以通过使用try catch捕获{{1}}来解决原始问题,但这个答案已经很长了,您可以阅读naming convention

答案 2 :(得分:0)

我最终解决了这个问题。我有一个'scan.next();'在调用我的inRange()方法的方法中。所以,一旦我删除它,我的问题请求输入两次解决,并且该方法成功检查它是否实际上是双。

    public static double deposit(double bankAcc, String pinCode, Scanner scan ) {
    boolean valid = false;
    double depositAmount = 0;

    System.out.print( "Please enter your PIN #: " );
    String pinCodeTest = scan.nextLine();

    while( valid == false ) {
        if( pinCodeTest.equals(pinCode)) {
            System.out.print( "How much would you like to deposit?: " );
            depositAmount = inRange( scan, 0, 1000000 );
            valid = true;
        }
        else {
            System.out.println( "Error! Incorrect PIN #. Try again: " );
            pinCodeTest = scan.nextLine();
        }
// I had a 'scan.next();' right here... Thinking it acted as a buffer clear!
    }
    return depositAmount;
}
    public static double inRange( Scanner scan, int min, int max ) {
    double amount = 0.0;
    boolean isValid = false;

    while( isValid == false ) {
        if( scan.hasNextDouble() ) {
            amount = scan.nextDouble();
            if( amount > max ) {
                System.out.print( "Error: You cannot enter a number greater than $1,000,000. Try again: " );
            }
            else if( amount < min ) {
                System.out.print( "Error: You cannot enter a negative number. Try again: " );
            }
            else {
                isValid = true;
                break;
            }
        }
        else {
            System.out.print( "Error: You must enter a number! Try again: " );
            scan.next();
        }
    }
    return amount;
}