循环不会达到哨兵值 - Java

时间:2012-12-06 03:08:58

标签: java while-loop infinite-loop

我的程序中有一个while循环,它不会达到sentinel值。该程序基本上读入一个包含字符串,int和double的数据库,然后循环回来。我的问题是它似乎没有在哨兵中读取,然后发生无限循环。我试图解决这个问题好几个小时,所以任何帮助都会非常有帮助。示例输入看起来像EndSearchKeys等于SECSENT。

还假设所调用的任何方法都不是问题,因为我已经删除了它并再次测试。

雷克萨斯2005 23678.0
福特2001 7595.0
本田2004 15500.0
EndSearchKeys

while(scan.hasNext())
    {
        if(carMake.equals(SECSENT))
        {
            break;
        }
        if(scan.hasNextInt())
        {
            carYear = scan.nextInt();
        }
        else
        {
            System.out.println("ERROR - not an int");
            System.exit(0);
        }
        if(scan.hasNextDouble())
        {
            carPrice = scan.nextDouble();
        }
        else
        {
            System.out.println("ERROR - not a double");
            System.exit(0);
        }
        Car key = new Car(carMake, carYear, carPrice);
        // Stores the output of seqSearch in pos.

        // If the debug switch is on, then it prints these statements.
        if(DEBUG_SW == true)
        {   
            System.out.println("Search, make = " + key.getMake());
            System.out.println("Search, year = " + key.getYear());
            System.out.println("Search, price = " + key.getPrice());
        }   
        System.out.println("key =");
        System.out.println(key);
        pos = seqSearch(carArr, count, key);
        if(pos != -1)
        {
            System.out.println("This vehicle was found at index = " + pos);
        }
        else
        {
            System.out.println("This vehicle was not found in the database.");
        }
        if(scan.hasNext())
        {
             carMake = scan.next();
        }
        else
        {
            System.out.println("ERROR - not a String");
            System.exit(0);
        }
    }

1 个答案:

答案 0 :(得分:0)

您在上面的回答中说,只有当您将Sentinel作为数据库中的最终值时才会出现问题。这是正在发生的事情。

在循环的最后,你这样做:

    if(scan.hasNext())
    {
         carMake = scan.next();
    }

现在,carMake = your sentinel value

循环重新开始,并执行此测试:

while(scan.hasNext())

但接下来扫描。您在上面的“消耗”(在前一个循环迭代结束时)。现在,“下一步”是“空”。因此,未输入循环,并且永远不会到达循环开始时的测试(下面)。

    if(carMake.equals(SECSENT))
    {
        System.out.println("Found sentinel value!  Breaking!");
        break;
    }

尝试将该测试移至循环的 end

或者,您可以将循环的条件更改为:

while(scan.hasNext() && !carMake.equals(SECSENT))