我目前正在尝试同时接受两个数组的输入。原因是阵列的每个位置处的数据是对应的,例如。姓名和身份证号码。
String[] arr = new String[5];
int[] arr1 = new int[5];
Scanner kb = new Scanner(System.in);
for(int i = 0; i<5; i++)
{
System.out.println("Enter a name:");
arr[i] = kb.nextLine();
System.out.println("Enter an ID:");
arr1[i] = kb.nextInt();
}
到目前为止我有这个代码,但每当我运行它时,它会询问一个名称和ID,然后要求两者,但只接受ID。
我似乎无法弄清楚为什么它不允许输入名称,它只是返回一个不兼容的数据类型错误。
答案 0 :(得分:5)
从第二次迭代开始,您的kb.nextLine()
读取名称会吞下输入的\n
新行字符以输入ID整数。
实际问题是nextInt()
离开char
令牌不是数字令牌,因此它们会留在stdin
。每当任何其他方法尝试读取stdin
时该方法接受该输入。 nextLine
方法在\n
之后返回,因此问题就出现了。
所以改变这样的代码:
String[] arr = new String[5];
int[] arr1 = new int[5];
Scanner kb = new Scanner(System.in);
for(int i = 0; i<5; i++)
{
System.out.println("Enter a name:");
arr[i] = kb.nextLine();
System.out.println("Enter an ID:");
arr1[i] = kb.nextInt();
kb.nextLine(); //now this swallows new line
}
或者你可以使用两个扫描仪:如果你想要的话应该没有任何关系给予输入......没有任何冲突......我不知道这是否效率低。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Tester {
public static void main(String[] args) throws Exception {
String[] arr = new String[5];
int[] arr1 = new int[5];
Scanner kb = new Scanner(System.in);
Scanner bc=new Scanner(System.in);
for(int i = 0; i<5; i++)
{
System.out.println("Enter a name:");
arr[i] = kb.nextLine();
System.out.println("Enter an ID:");
arr1[i] = bc.nextInt();
}}
}
答案 1 :(得分:0)
您正在获得您描述的行为,因为nextInt()
只读取下一行的下一个整数,而不是该行的剩余部分(为空。)所以当循环回来时nextLine()
1}}方法被调用,它拾取(空)行的其余部分。您应该在循环结束时放置kb.nextLine()
方法,然后按照您的描述进行操作。
但是,在这样的并行数组中输入数据并不是最好的做法 - 你应该创建一个自定义类,然后将数组类型作为该类,或者使用ID的Map来命名。
答案 2 :(得分:0)
对我而言,这听起来像是在kb.nextInt()
调用后仍然存储在输入缓冲区中的换行符,所以当你调用kb.nextLine()
时,它会读取这个换行符(作为一个空字符串,因为nextLine()
函数将在遇到的第一个换行符处停止,因此您的程序会要求您提供下一个ID。
有效地跳过随后要求提供名称的任何时间。
我可能会在kb.nextLine()
调用后直接添加另一个kb.nextInt()
调用,以清除缓冲区中的\ n(换行符)字符。