-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」行以降の「lines」配列に問題があることです。これらの 0001 から 0010 までの行はいずれも問題ありません。そして、私が気付いたもう1つのことは、位置[1]、[2]、[3]、[4]でのみ発生し、位置[0]では発生しないことです(たとえば、「if(linea [0]. equals("2"))" [1] の代わりに問題はありません)。

だから私はここでちょっと迷っています。それはメインクラスだけです。数分前に行っていたように 6 o 7 を試すのではなく、100 行追加するまで問題なく動作していました。

正直なところ、何が原因なのかはわかりませんが、ファイルの読み取り方法に関係があると思われます。

前もって感謝します、イヴァン

アップデート:

linea[1] にアクセスする前に print を配置したところ、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

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 に答える