Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的Java程序中的循环不工作?_Java_Loops_Arraylist - Fatal编程技术网

为什么我的Java程序中的循环不工作?

为什么我的Java程序中的循环不工作?,java,loops,arraylist,Java,Loops,Arraylist,我想创建一个构造函数,在这个构造函数中,我将要求用户输入一个人的姓名,该姓名将存储在ArrayList中,然后要求用户输入同一个人的电话号码,该号码也将存储在另一个ArrayList中。这应该保持循环,除非用户键入“否”,这将结束循环 然而,当我在一个演示类中运行该方法时,第一次迭代运行良好,但第二次超时,它不工作,因为它跳过用户输入的人名,直接跳到输入的电话号码 我到底做错了什么 public PhoneBookEntry() { System.out.println("Enter t

我想创建一个构造函数,在这个构造函数中,我将要求用户输入一个人的姓名,该姓名将存储在ArrayList中,然后要求用户输入同一个人的电话号码,该号码也将存储在另一个ArrayList中。这应该保持循环,除非用户键入“否”,这将结束循环

然而,当我在一个演示类中运行该方法时,第一次迭代运行良好,但第二次超时,它不工作,因为它跳过用户输入的人名,直接跳到输入的电话号码

我到底做错了什么

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("");
    }
}

您的问题在于扫描仪对象。请理解扫描仪的
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);

结束是的,注释是正确的——这是一个糟糕的构造函数。构造函数不用于直接与用户交互,而仅用于创建对象。

请不要编写这样的构造函数。我建议不要在构造函数中进行任何复杂的工作。如何有效地测试在自己的构造函数中执行复杂IO的类?
kb
没有定义,也没有在代码中的任何地方传递……为什么人们对这个问题投反对票?因为他不知道不能把它放在构造函数里?至少他尝试并编写了一些代码,而且似乎自己也研究了一些。I/O应该像这里所示的那样进行:在创建对象的主类中。既然输入的值永远只能是-1,为什么不直接读取int呢?@Makoto:是的,可以调用
nextInt()
,但问题仍然存在,因为此方法也不处理EOL令牌。@Makoto如果用户输入电话号码,则该值将不会为-1。他仍然可以使用int,但可以是另一个intvalue@jrubins:如果输入一个电话号码并将其解释为八进制数字(以0开头的数字),则它将输入一个比预期值低的值,或者在8或9上爆炸。@hoverCraftFullOfels:True,但在重新阅读案例后,最好使用nextLine()以字符串形式获取行/EOL,以防数字以前导0输入。