Java 是否在不等待用户输入的情况下执行while循环?
我确信这是一件我无法发现的简单事情,我有一个do-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
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
语句来执行循环退出。也许我错了,但你可以通过这种方式减少你的代码,只接受一个有效的输入。这就解决了它。我刚刚想到,添加额外的打印行并不是清除键盘缓冲区的方法,毕竟,这是添加额外的下一行。睡眠剥夺再次发生。