如何简化此整数验证?

时间:2016-04-25 16:11:34

标签: java

我是Java新手,我正在我的程序中研究一种方法,该方法检查用户输入是否在边界内,而不是空值(零),而不是字母和正数。所以最初我在这个方法中加入了两个while循环来检查这些输入的有效性,但我想在一个循环中简化它。我在输入一些字母后输入一个字母(例如a)时出现错误,我认为这是由于两个不同的while循环使它变得更复杂。有人可以帮帮我吗?

public static void valid(String s, int max) 
{ 
    while(sc.hasNextInt() == false) {
        System.out.println("That is not correct. Try again:");
        sc.nextLine();  

    }

    int value;
    while((value= sc.nextInt()) > max || (value= sc.nextInt()) <= 0){
        System.out.println("That is not correct. Try again: ");
        sc.nextLine();
    }
    sc.nextLine();
    return;

} 

4 个答案:

答案 0 :(得分:1)

尝试更像(伪代码):

while valid input not yet received:
    if input is an integer:
        get integer
        if in range:
            set valid input received
    skip rest of line

extended validation

经过一番思考,您应该能够使用一个&#34;打印错误消息&#34;声明。但使用两个可能会更好;它可以告诉用户他们做错了什么。

答案 1 :(得分:1)

你有:

int value;
    while((value= sc.nextInt()) > max || (value= sc.nextInt()) <= 0){
        System.out.println("That is not correct. Try again: ");
        sc.nextLine();
    }

两次执行sc.nextInt(),因此value在这两种情况下不一定具有相同的值,而且还要求您输入两次。

修复将是这样的:

int value;
    while((value = sc.nextInt()) > max || value <= 0) {
        System.out.println("That is not correct. Try again: ");
        sc.nextLine();
    }

会让它变得更好,但你仍然有问题。如果value大于max,那么循环将再次调用nextInt(),但这次您检查hasNextInt()。这就是为什么你最好在一个循环中拥有所有东西。像这样:

public static void valid(String s, int max) { 
    while(true) {
        if(!sc.hasNextInt()) { //this is the same as sc.hasNextInt() == false
            System.out.println("That is not correct. Try again:");
            sc.nextLine();
            continue; //restart the loop again
        } else {
            int value = sc.nextInt();
            if(value > max || value <= 0) {
                System.out.println("That is not correct. Try again:");
                sc.nextLine();
                continue; //restart the loop from the top - important!
            } else {
                extendedValidation(value, s);
                return;
            }
        }
    }
}

答案 2 :(得分:0)

String s参数的目的是什么?您应该检查而不是扫描仪输入吗?

另外,混淆nextInt()nextLine()并不会感到惊讶。 - Source

我更喜欢在验证之前使用do-while循环进行输入。

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    int max = 1000;
    int val = -1;
    String in;

    do {
        // Read a string
        System.out.print("Enter a number: ");
        in = input.nextLine();

        // check for a number
        try {
            val = Integer.parseInt(in);
        } catch (NumberFormatException ex) {
            // ex.printStackTrace();
            System.out.println("That is not correct. Try again.");
            continue;
        }

        // check your bounds
        if (val <= 0 || val > max) {
            System.out.println("That is not correct. Try again.");
            continue;
        } else {
            break; // exit loop when valid input
        }

    } while (true);

    System.out.println("You entered " + val);
    // extendedValidation(value, in);
}

答案 3 :(得分:0)

我会说,这比你正在寻找的东西更接近,简单来说......

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        final int MIN = 0;
        final int MAX = 10;
        Scanner sc = new Scanner(System.in);
        int value = -1;
        boolean valid;

        do {
            valid = sc.hasNextInt();
            if (valid) {
                value = sc.nextInt();
                valid = value > MIN && value < MAX;
            }

            if (!valid) {
                System.out.println("Invalid!");
                sc.nextLine();
            }
        } while (!valid);

        System.out.println("Valid Value: " + value);
    }
}

您应该能够抽象此代码以满足您的要求。