当条件为真时循环不进入

时间:2014-12-08 20:36:35

标签: java while-loop

我正在创建一个方法,它将读取一个文件并返回一个PersonList(我创建的一个类)的arrayList。在这个方法中,我目前有两个while循环(每个循环都有自己的try / catch)。第一个完美运行,但第二个似乎没有进入循环,即使条件为真。这是我的代码:

public static ArrayList <Person> read(String fileName)
{
    int counter = 0;
    ArrayList <Person> persons = new ArrayList <Person> ();
    ArrayList <String> temp = new ArrayList <String> ();
    ArrayList <String> tempTwo = new ArrayList <String> ();

    try
    {   
        Scanner inputFile = new Scanner(new FileReader(fileName));
        String unusedLine = inputFile.nextLine();
        String name = inputFile.nextLine();


        while(inputFile.hasNextLine())
        {
            unusedLine = inputFile.nextLine();
            String tempDate = inputFile.nextLine();
            temp.add(tempDate);
            String tempWeight = inputFile.nextLine();
            temp.add(tempWeight);
            unusedLine = inputFile.nextLine();

            counter += 2; //one for each entry
            //System.out.println("counter: " + counter);

        }
    }
    catch(Exception e)
    {
        System.out.println(e.getMessage());
    }

    try
    {
        counter += 1; // one for name
        System.out.println(counter);

        while(counter > 0)
        {
            String tempString = temp.get(counter);
            //System.out.println(tempString);
            int start = tempString.indexOf('>');
            System.out.println(start);
            int end = tempString.indexOf('<', start);
            System.out.println(end);
            String subStringTemp = tempString.substring(start, end);
            System.out.println("parsed: " + subStringTemp);
            temp.add(subStringTemp);


            counter --;

        }
    }
    catch(Exception f)
    {
        System.out.println(f.getMessage());
    }





    return(null);//just so it compiles

我正在阅读的文件类型是xml,看起来像这样:

<person>
    <name>name</name>
    <entry>
        <date>10.12.14</date>
        <weight>172.1</weight>
    </entry>
</person>

第二个循环中的Print Statement不打印任何内容:

No line found           //first catch prints this exception
10                      //value of counter before second loop
Index: 10, Size: 10     //I don't know what this is

为什么我的while循环永远不会被输入?

编辑:我忘记了为我的ArrayList添加名称,所以当我已经在计数器中计算它的大小为11时它的大小为10。感谢大家帮助我以正确的方式思考它! / p>

3 个答案:

答案 0 :(得分:1)

它的行IndexOutOfBoundsException在行:

String tempString = temp.get(counter);

ArrayList的默认容量为10

答案 1 :(得分:1)

您有10个对象的列表。要使用索引迭代该列表,这是您使用temp.get进行的操作,您将通过temp.get(0)调用temp.get(9)。但是当你进入第二个while循环时,你正在调用temp.get(10),它不存在。您应该做的是temp.get(counter - 1)并将while子句更改为while(counter >= 0)

我想强调dasblinkenlight的观点,即这是一种解析XML的可怕方法。如果您的任务是解析XML字符串并打印出它的对象,我会特别向您推荐Google。

答案 2 :(得分:0)

抛开解析器的质量,代码似乎进入第二个循环,但循环体的第一行抛出一个out of bounds异常的索引(你看到&#34;索引:10,大小:10& #34;根据捕获部分打印)。数组具有从零开始的索引,因此如果在第一个循环之后计数器值为N,如果打算读取第二个循环中的最后一个元素,则它应该是N-1。

String tempString = temp.get(counter - 1);

这可能有所帮助,也可能无效,因为还有另一个问题。在第二个循环之前,将计数器递增1(带有要处理的注释&#34; name&#34;但名称值从未添加到数组中),这更有助于索引问题。还有更多,在第二个循环中,您似乎读取值,解析数据并将解析后的数据放回到相同的数组列表中。不确定预期的结果是什么。一个简单的单元测试会发现这些问题,在修复代码之后,它会长期为你服务。

此外,正如许多人所建议的那样,它不是推荐的解析XML内容的方法。我强烈建议使用XML解析器。