Java给我一个异常(在大多数情况下是一个可靠的初学者和易于修复的错误),我无法弄清楚(这是控制台输出):
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at guia3.Main.addHab(Main.java:59)
at guia3.Main.main(Main.java:32)
这是代码
public static void main(String[] args) throws FileNotFoundException
{
ArrayList <HabitacionDoble> habDoble = new ArrayList<HabitacionDoble>();
ArrayList <HabitacionTriple> habTriple = new ArrayList <HabitacionTriple>();
ArrayList <Depto4Plus> deptos = new ArrayList <Depto4Plus>();
int i;
String linea[];
File roomsFile = new File ("C:\\Users\\Notebook\\Guia 3\\rooms.txt");
//leer el archivo para test
Scanner x = new Scanner (roomsFile);
while (x.hasNext())
{
linea = x.nextLine().split(";");
System.out.println(linea[0]);//this is just for testing purpose, trying to find where the error falls
addHab (linea, habDoble, habTriple, deptos);
}
x.close();
}//end main
public static void addHab (String[] linea, ArrayList<HabitacionDoble> habDoble, ArrayList<HabitacionTriple> habTriple,
ArrayList <Depto4Plus> deptos)
{
if (linea[1].equals("2"))
{
habDoble.add(new HabitacionDoble());
habDoble.get(habDoble.size()-1).setCodigo(linea[0]);
habDoble.get(habDoble.size()-1).queCategoria(linea[2]);
habDoble.get(habDoble.size()-1).setDescripcion(linea[4]);
habDoble.get(habDoble.size()-1).setOcupada(Integer.parseInt(linea[3]));
}
else if (linea[1].equals("3"))
{
habTriple.add(new HabitacionTriple());
habTriple.get(habTriple.size()-1).setCodigo(linea[0]);
habTriple.get(habTriple.size()-1).queCategoria(linea[2]);
habTriple.get(habTriple.size()-1).setDescripcion(linea[4]);
habTriple.get(habTriple.size()-1).setOcupada(Integer.parseInt(linea[3]));
}
else if (Integer.parseInt(linea[1]) > 3)
{
deptos.add(new Depto4Plus());
deptos.get(deptos.size()-1).setCodigo(linea[0]);
deptos.get(deptos.size()-1).queCategoria(linea[2]);
deptos.get(deptos.size()-1).setDescripcion(linea[4]);
deptos.get(deptos.size()-1).setOcupada(Integer.parseInt(linea[3]));
}
}//end method
}//end class
我正在阅读的文件格式如下:
0001;2;estandar;0;Habitación doble categoría Estandar
0002;3;estandar;0;Habitación triple categoría Estandar
0003;2;suite;0;Habitación doble categoría Suite
...
0010;3;estandar;0;Habitación triple categoría Estandar
0011;3;estandar;0;Habitación triple categoría Estandar
0012;3;estandar;0;Habitación triple categoría Estandar
它继续代码“0100”(因此它有100行)。
我注意到我从第“0010”行开始遇到“lines”数组的问题。从0001到0010的这些行都没有出现任何问题。而我注意到的另一件事是它只发生在位置[1],[2],[3],[4],而不是位置[0](例如,如果我放“if(linea [0]。等于(“2”))“而不是[1]我不会有任何问题。”
所以我有点迷失在这里,这只是主要的课程。它工作正常,直到我添加了100行,而不是像我在几分钟前那样尝试6 o 7。
任何帮助都是值得赞赏的,老实说,我不知道是什么导致了它,虽然我怀疑它与我正在阅读文件的方式有关。
提前致谢, 伊万
更新:
我只是在访问linea [1]之前放了一个打印件,结果是在10行读取之后,它停止读取或检索任何内容,因此数组“linea”为空。为什么会这样?我没有线索。根本没有得到这种行为!
(String[] linea, ArrayList<HabitacionDoble> habDoble, ArrayList<HabitacionTriple> habTriple,
ArrayList <Depto4Plus> deptos)
{
System.out.println ("line has a length of "+linea.length);
if (linea[1].equals("2"))
{
habDoble.add(new HabitacionDoble());
habDoble.get(habDoble.size()-1).setCodigo(linea[0]);
habDoble.get(habDoble.size()-1).queCategoria(linea[2]);
habDoble.get(habDoble.size()-1).setDescripcion(linea[4]);
habDoble.get(habDoble.size()-1).setOcupada(Integer.parseInt(linea[3]));
}
我运行此输出后的输出:
0001
line has 5 lenght
0002
line has 5 lenght
0003
line has 5 lenght
0004
line has 5 lenght
0005
line has 5 lenght
0006
line has 5 lenght
0007
line has 5 lenght
0008
line has 5 lenght
0009
line has 5 lenght
0010
line has 5 lenght
line has 1 lenght
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at guia3.Main.addHab(Main.java:71)
at guia3.Main.main(Main.java:36)
编辑调试:
我在Eclipse中调试过(有史以来第一次)这是我在这个阶段发现最奇怪的事情(请按照图片):
http://i.imgur.com/mF4U73i.png
正如您所看到的,HeapCharBuffer只是使“0010”后面的行完全空白,并且打破了我在.txt文件中为以下行建立的格式。
我甚至不知道这是否是造成这个问题的原因,但它确实引起了我的注意(屏幕是从while循环开始,在开始阅读第11行之后)。
更新:
显然,这显然是我的错。如果我粘贴.txt文件中的文本,它也会打破调试时看到的格式。为什么会这样?它现在显然是一个与文件相关的问题。0001;2;estandar;0;Habitación doble categoría Estandar
0002;3;estandar;0;Habitación triple categoría Estandar
0003;2;suite;0;Habitación doble categoría Suite
0004;4;superior;1;Departamento categoría Superior
0005;3;superior;1;Habitación triple categoría Estandar
0006;2;suite;0;Habitación doble categoría Suite
0007;3;suite;1;Habitación triple categoría Suite
0008;4;estandar;0;Departamento categoría estandar
0009;3;estandar;0;Habitación triple categoría Estandar
0010;3;estandar;0;Habitación triple categoría Estandar
0011;3;estandar;0;Habitación triple categoría Estandar
0012;
3;estandar;0;Habitación triple categoría Estandar
0013;
3;estandar;0;Habitación triple categoría Estandar
这就是它在txt中的样子(我认为它没问题,但显然有些不对劲!):
答案 0 :(得分:1)
指向addHab方法中的“linea [1]”错误。看起来数组的大小小于2.
答案 1 :(得分:0)
while (x.hasNext())
应为while (x.hasNextLine())
,因为您之后正在调用x.nextLine()
。
建议:
验证linea.length > 2
抛出更优雅的异常。您的输入是一个可以包含任何内容的文本文件。
在试用版中打开扫描仪并在finally块中关闭它,这样就不会有资源泄漏:
Scanner scanner = null;
try {
scanner = new Scanner(file);
...
} finally {
if(scanner != null) {
scanner.close();
}
}