Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否在不等待用户输入的情况下执行while循环?_Java_Loops_Do While - Fatal编程技术网

Java 是否在不等待用户输入的情况下执行while循环?

Java 是否在不等待用户输入的情况下执行while循环?,java,loops,do-while,Java,Loops,Do While,我确信这是一件我无法发现的简单事情,我有一个do-while循环,提示用户输入数组大小,这将用于程序的其余部分。如果用户输入正确,程序将继续运行并正常工作,但如果用户输入错误 public static void main(String[] args) { // user enters up to 20 double values, stored in an array, user should enter 99999 to quit entering numbers. If user ha

我确信这是一件我无法发现的简单事情,我有一个do-while循环,提示用户输入数组大小,这将用于程序的其余部分。如果用户输入正确,程序将继续运行并正常工作,但如果用户输入错误

public static void main(String[] args)
{
  // user enters up to 20 double values, stored in an array, user should enter 99999 to quit entering numbers. If user has not entered any numbers yet
  // display an error message, otherwise, display each entered value and it's distance from the average

  Scanner keyboard = new Scanner(System.in);
  int arraySize = 0;
  boolean isValid = false;

  do
  {
     isValid = true;
     arraySize = 0; // reset these values at start of each loop.

     System.out.println("Enter an array size.");
     try {
        arraySize = keyboard.nextInt();
     }
     catch(NegativeArraySizeException mistake) {
        System.out.println("Do not enter a negative number for the arrays size.");
        System.out.println();
        isValid = false;
     }
     catch(InputMismatchException mistake) {
        System.out.println("Make sure to enter a valid number.");
        System.out.println();
        isValid = false;
     }
  } while (isValid == false);
如果用户输入了无效的输入,如“红色”,则catch块将启动并反复打印“确保输入有效数字”和“输入数组大小”,而不给用户实际输入任何输入的机会。我认为重置arraySize变量可以解决这个问题,但事实并非如此。我猜键盘缓冲区中有东西,但到目前为止,没有空println的组合起作用

我听说不应该使用异常来验证用户输入。为什么呢


无论如何,这与这个问题无关,因为这是一个异常处理练习。

不使用
isValid
布尔变量,并为输入生成简单代码

int arraySize = 0;
do {
    System.out.println("Enter a valid array size.");
    try {
        arraySize = Integer.valueOf(keyboard.nextLine());
        if (arraySize < 0) throw new NegativeArraySizeException();// for negative arry size
        break;// loop break when got a valid input
    } catch (Exception mistake) {
        System.err.println("Invalid input: " + mistake);
    }
} while (true);
int-arraySize=0;
做{
System.out.println(“输入有效的数组大小”);
试一试{
arraySize=Integer.valueOf(keyboard.nextLine());
如果(arraySize<0)抛出新的NegativeArraySizeException();//用于负arry大小
break;//获得有效输入时循环中断
}捕获(异常错误){
System.err.println(“无效输入:+错误”);
}
}虽然(正确);

请查看此修复程序是否适用于您。当您试图从nextInt函数获取字符串时,Scanner出现问题。在本文中,我获取了字符串并解析为整数,然后处理数字格式异常

public static void main(String[] args) {
    // user enters up to 20 double values, stored in an array, user should enter 99999 to quit entering numbers. If user has not entered any numbers yet
    // display an error message, otherwise, display each entered value and it's distance from the average

    Scanner keyboard = new Scanner(System.in);
    int arraySize = 0;
    boolean isValid = false;

    do {
        isValid = true;
        arraySize = 0; // reset these values at start of each loop.

        System.out.println("Enter an array size.");
        try {
            arraySize = Integer.parseInt(keyboard.next());
        } catch (NegativeArraySizeException mistake) {
            System.out.println("Do not enter a negative number for the arrays size.");
            System.out.println();
            isValid = false;
        } catch (InputMismatchException mistake) {
            System.out.println("Make sure to enter a valid number.");
            System.out.println();
            isValid = false;
        } catch (NumberFormatException nfe) {
            System.out.println("Make sure to enter a valid number.");
            System.out.println();
            isValid = false;
        }

    } while (isValid == false);
}

您可以添加键盘。nextLine();在出现异常情况时,应解决该问题

 try {
    arraySize = keyboard.nextInt();
 }
 catch(NegativeArraySizeException mistake) {
    System.out.println("Do not enter a negative number for the arrays size.");
    System.out.println();
    isValid = false;
    keyboard.nextLine();
 }
 catch(Exception mistake) {
    System.out.println("Make sure to enter a valid number.");
    System.out.println();
    isValid = false;
    keyboard.nextLine();
   }

穆扎希德快到了。但我也增加了一种检查负数的方法。试试这个

    Scanner keyboard = new Scanner(System.in);
    int arraySize = 0;
    boolean isValid = false;
    do {
        System.out.println("Enter a valid array size.");
        try {
            arraySize = Integer.valueOf(keyboard.nextLine());

            if (arraySize < 0) {
                System.out.println("Make sure to enter a valid positive number.");
            } else {
                break;
            }
        } catch (Exception mistake) {
            System.out.println("Make sure to enter a valid number. Error:" + mistake);
        }
    } while (true);
扫描仪键盘=新扫描仪(System.in);
int-arraySize=0;
布尔值isValid=false;
做{
System.out.println(“输入有效的数组大小”);
试一试{
arraySize=Integer.valueOf(keyboard.nextLine());
if(数组化<0){
System.out.println(“确保输入有效的正数”);
}否则{
打破
}
}捕获(异常错误){
System.out.println(“确保输入有效数字。错误:+错误”);
}
}虽然(正确);

使用
键盘.nextLine()
数字格式异常

do {
            // more code
            try {
                arraySize = Integer.valueOf((keyboard.nextLine()));
            } catch (NegativeArraySizeException mistake) {
                // more code
                isValid = false;
            } catch (InputMismatchException mistake) {
                // more code
                isValid = false;
            } catch (NumberFormatException mistake) {
                // more code
                isValid = false;
            }
} while (isValid == false);

穆扎希德快到了。我添加了一种方法来检查输入值的负性。请检查[Scanner类中的next()和nextLine()方法之间有什么区别?]()“break;”是否会导致任何问题?我知道某些事情,比如“goto”之类的东西会引起问题。如果没有,这似乎是一种非常优雅的设置“无限”循环的方法,我将采用这种方法作为解决此类问题的方法。@SpaceOstrich Java中没有
goto
。当得到一个有效的非负整数来设置数组大小时,我使用了
break
语句来执行循环退出。也许我错了,但你可以通过这种方式减少你的代码,只接受一个有效的输入。这就解决了它。我刚刚想到,添加额外的打印行并不是清除键盘缓冲区的方法,毕竟,这是添加额外的下一行。睡眠剥夺再次发生。