我想创建一个构造函数,我会要求用户输入一个将存储在ArrayList中的人名,然后要求用户输入同一个人的电话号码,该号码也将存储在另一个人名单中。数组列表。 除非用户输入“no”然后结束循环,否则这应该保持循环。 但是,当我在一个演示类中运行该方法时,第一次迭代工作正常但第二次超时,它不起作用,因为它跳过用户输入的人名并直接跳转到电话号码的输入。 我究竟做错了什么?谢谢你的帮助
public PhoneBookEntry()
{
System.out.println("Enter the following requested data.");
System.out.println("");
int i=0;
while(i==0)
{
System.out.println("Enter the name of the person (enter 'no' to end): ");
input_name = kb.nextLine();
if(!input_name.equalsIgnoreCase("no"))
{
name.add(input_name);
System.out.println("Enter the phone number of that person (enter '-1' to end): ");
input_number = kb.nextLong();
phone_number.add(input_number);
}
else
{
name.trimToSize();
break;
}
System.out.println("");
}
}
答案 0 :(得分:3)
您的问题出在Scanner对象上。了解扫描程序的nextLong()
和类似方法(例如nextInt()
,nextDouble()
,next()
)不会处理行尾(EOL)令牌。你必须自己努力处理它。
一种方法是添加对nextLine()
的调用,如下所示:
System.out.println("Enter the name of the person (enter 'no' to end): ");
input_name = kb.nextLine();
if(!input_name.equalsIgnoreCase("no"))
{
name.add(input_name);
System.out.println("Enter the phone number of that person (enter '-1' to end): ");
input_number = kb.nextLong();
phone_number.add(input_number);
到此:
System.out.println("Enter the name of the person (enter 'no' to end): ");
input_name = kb.nextLine();
if(!input_name.equalsIgnoreCase("no"))
{
name.add(input_name);
System.out.println("Enter the phone number of that person (enter '-1' to end): ");
input_number = kb.nextLong();
kb.nextLine(); // **** added to handle the EOL ****
phone_number.add(input_number);
结束是的,评论是对的 - 这是一个可怕的构造函数。构造函数不是直接与用户交互,而是仅用于创建对象。