0

我的程序中有一个不会达到哨兵值的 while 循环。该程序基本上读入一个包含一个字符串、一个 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);
        }
    }
4

1 回答 1

0

您在上面的回复中说,仅当您将哨兵设为数据库中的最终值时才会出现问题。这是正在发生的事情。

在循环的最后,您执行以下操作:

    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;
    }

尝试将该测试移到循环的末尾

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

while(scan.hasNext() && !carMake.equals(SECSENT))
于 2012-12-06T03:34:16.170 回答