我是JAVA的初学者。
我正在编写一个具有菜单的程序,并允许用户选择诸如数组大小,数组中的元素等选项。所以我已经全部工作了,我正在最终确定边界,以便在用户输入不同数据元素的情况下循环回来。
我的问题 - 如何创建一个存储整数和一个循环的循环如果选择另一个原语,浮动但环回?
int a;
for (int i = 0; i<array.length;i++) {
boolean validate = false;
System.out.print("Give me a value");
while (validate == false) {
a = input.nextInt();
if (input.hasNextFloat()) {
numbers[i] = input.nextFloat();
validate = true;
}
else if (input.hasNextInt()) {
a = input.nextInt();
numbers[i] = 1.0f *a;
validate = true;
}
else {
System.out.println("This is not an acceptable primitive. Try again");
validate = false;
}
}
}
答案 0 :(得分:1)
如果你得到一个原始类型,第一件事就是你的循环规范。
if (input.hasNextFloat()) {
// Catches float
} else if (input.hasNextInt()) {
// Catches int
} else {
// Catches any other type
}
当第一个条件捕获float
而第二个条件捕获int
时,else会捕获任何其他类型。虽然这可能是剩余的6 primitive types中的任何一个,但它也可能是一个字符串(reference type,而不是原始字符。
第二件事是int是有效的float,但float不是有效的int;也就是说,如果您正在扫描浮点数并接收int作为输入,您将接受它作为浮点数。无论如何,当您将int转换为float时,检查int是多余的,因为如果它作为浮点验证失败,它将永远不会成功。
同样关于原语,所有浮点数都是双精度数,所有短数都是整数,有些长数是整数等等。所以你选择“如果选择了另一个原始类型则回环”这一区别是有点不确定的。
另一件事是你尝试在for循环的开头读取一个int - 如果输入不是int,这将抛出InputMismatchException
异常。这可能是为了消耗线,但它只是跳过一个值最佳的情况(抛出异常是最糟糕的)。相反,如果确定值不是合适的格式,则应该使用该行,以避免卡在无限循环中。
else {
System.out.println(input.next() + " is not an acceptable primitive. Try again");
}
validate
布尔值仅用于基本上不跳过索引。考虑只是递减for循环中的迭代计数器以避免额外的if语句,因为for循环将再次增加它。虽然这会重新打印“给我一个价值”的信息,但这归结为偏好。
else {
System.out.println("...");
i--;
}
这样的事情会达到你想要的效果:
float[] array = new float[3];
Scanner input = new Scanner(System.in);
for (int i = 0; i<array.length;i++) {
System.out.print("Give me a value: ");
if (input.hasNextFloat()) {
array[i] = input.nextFloat();
} else {
System.out.print(input.next() + " is not an acceptable type. ");
i--;
}
}
需要注意的另一件事是你不需要将int转换为float,除非你明确地想要做什么。 int和float的包装类型都扩展为Number,因此您可以使用Number数组。
Number array[] = new Number[size];
...
array[0] = 10;
array[1] = 1.5f;