我正在创建一个方法,它将读取一个文件并返回一个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>
答案 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解析器。