我无法退出while循环。
我不知道为什么sc.hasNextInt()
在上次读取后没有返回false。
我应该使用其他方法还是我的代码有错误?
public static void main(String[] args) {
// Creating an array by user keyboard input
Scanner sc = new Scanner(System.in);
System.out.println("Length of array: ");
int[] numbers = new int[sc.nextInt()];
System.out.printf("Type in integer elements of array ", numbers.length);
int index = 0;
**while ( sc.hasNextInt()) {**
numbers[index++] = sc.nextInt();
}
// created method for printing arrays
printArray(numbers);
sc.close();
}
执行以下操作:
使用输入长度作为循环的结尾。
// Creating an array by user keyboard input
Scanner sc = new Scanner(System.in);
System.out.println("Length of array: ");
int len = sc.nextInt();
int[] numbers = new int[len]; // use len here
System.out.printf("Type in integer elements of array ", numbers.length);
int index = 0;
for (index = 0; index < len; index++) { // and use len here
numbers[index] = sc.nextInt();
}
// created method for printing arrays
printArray(numbers);
sc.close();
并且不要关闭扫描仪。
当您从控制台接收输入时,位于hasNextInt()
循环条件内的Scanner while
方法将继续读取(意味着循环将继续),直到发生以下情况之一:
因此,在您的情况下,您不能在while循环条件内使用hasNextInt()
-我在下面显示了一个可以使用计数器变量的解决方案。
然而,hasNextInt()
循环中的while
方法在从控制台以外的其他来源读取时具有实际用途-例如从字符串或文件。从示例here中得到启发,假设我们有:
String s = "Hello World! 3 + 3.0 = 6 ";
然后我们可以将字符串s
作为输入源传递给Scanner(注意,我们没有将System.in
传递给构造函数:]
Scanner scanner = new Scanner(s);
然后循环直到hasNext()
,它检查输入中是否存在其他任何类型的标记。在循环内,使用hasNextInt()
检查此令牌是否为int并打印,否则使用next()
将令牌传递给下一个令牌:
while (scanner.hasNext()) {
if (scanner.hasNextInt()) {
System.out.println("Found int value: " + scanner.next());
} else {
scanner.next();
}
}
结果:
Found int value: 3
Found int value: 6
在上面的示例中,我们无法在while循环条件本身中使用hasNextInt()
,因为该方法在找到的第一个非整数字符上返回false(因此循环立即关闭,因为我们的String以字母开头) 。
但是,我们可以使用while (hasNextInt())
来读取list of numbers from a file。
现在,解决您的问题将index
变量放在while循环条件内:
while (index < numbers.length) {
numbers[index++] = sc.nextInt();
}
或者为了清楚起见,请设置一个特定的计数器变量:
int index = 0;
int counter = 0;
while (counter < numbers.length) {
numbers[index++] = sc.nextInt();
counter++;
}
解决您的代码中的以下问题:
int n = sc.nextInt();
),并使用该值创建所需大小的数组(即int[] numbers = new int[n];
)并控制循环应执行的次数(即[ C0])。while (index < n && sc.hasNextInt()) {...}
的Scanner
对象,因为它也会关闭System.in
,这将不允许使用System.in
(例如键盘)进行任何进一步的输入。在大型程序中,您可能需要进一步输入,这可能是个问题。下面给出的代码结合了上述要点:
System.in
示例运行:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// Creating an array by user keyboard input
Scanner sc = new Scanner(System.in);
System.out.print("Length of array: ");
int n = sc.nextInt();
int[] numbers = new int[n];
System.out.printf("Type in %d integer elements of array: ", numbers.length);
int index = 0;
while (index < n && sc.hasNextInt()) {
numbers[index++] = sc.nextInt();
}
// created method for printing arrays
printArray(numbers);
}
static void printArray(int[] numbers) {
for (int n : numbers) {
System.out.print(n + " ");
}
}
}