-1

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”行开始,我遇到了“行”数组的问题。从 0001 到 0010 的这些行都没有任何问题。我注意到的另一件事是它只发生在位置 [1]、[2]、[3]、[4],而不是位置 [0](例如,如果我输入“if (linea[0]. equals("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 中的样子(我认为没问题,但显然有问题!):

http://i.imgur.com/z1jPArU.png

4

2 回答 2

1

在 addHab 方法中使用“linea[1]”指向错误。看起来数组的大小小于 2。

于 2013-04-26T20:53:23.123 回答
0

while (x.hasNext())应该是while (x.hasNextLine())因为您正在调用x.nextLine()之后。

建议:

验证它linea.length > 2以抛出更优雅的异常。您的输入是一个可以包含任何内容的文本文件。

在 try 中打开你的 Scanner 并在 finally 块中关闭它,这样你就不会发生资源泄漏:

Scanner scanner = null;
try {
    scanner = new Scanner(file);
    ...
} finally {
    if(scanner != null) {
        scanner.close();
    }
}
于 2013-04-26T21:11:56.720 回答