不能在我的阵列中发现错误

时间:2018-06-13 18:42:43

标签: java arrays arraylist

   public static void main(String[] args) {
    int i;
    ArrayList apartment = new ArrayList();
    ArrayList area = new ArrayList();
    ArrayList lightbulb = new ArrayList();
    ArrayList windows = new ArrayList();
    System.out.println("Введите количество квартир в здании.");
    Scanner sc = new Scanner(System.in);
    int house = sc.nextInt();
    apartment.add("");
    area.add("");
    lightbulb.add("");
    windows.add("");
    for (i=1; i<=house; i++){
        Apartments home = new Apartments();
        System.out.println("Введите площадь квартиры " + i);
        Scanner S = new Scanner(System.in);
        home.area = S.nextDouble();
        area.add(home.area);
        System.out.println("Введите колич1ество окон в квартире " + i);
        Scanner W = new Scanner(System.in);
        home.windows = W.nextInt();
        windows.add(home.windows);
        System.out.println("Введите количество лампочек в квартире " + i);
        Scanner L = new Scanner(System.in);
        home.lightbulb = L.nextInt();
        lightbulb.add(home.lightbulb);
    }
    for(i=1; i<=house; i++)
    System.out.println("Площадь квартиры " + i + "составляет " + area.get(i));
    System.out.println("Количество окон в квартире равно: "  + windows.get(i));
    System.out.println("Количество лампочек в квартире равно:  " + lightbulb.get(i));
}

你好everebody!我无法理解这段代码中的错误。我收到这个错误:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    at java.util.ArrayList.rangeCheck(ArrayList.java:657)
    at java.util.ArrayList.get(ArrayList.java:433)
    at Planning.main(Planning.java:37)

IDEA在这部分System.out.println("Количество окон в квартире равно: " + windows.get(i));显示错误,但仍然无法理解错误

2 个答案:

答案 0 :(得分:2)

你忘记了println语句周围的卷曲括号:

for(i=1; i<=house; i++)
    System.out.println("Площадь квартиры " + i + "составляет " + area.get(i));
    System.out.println("Количество окон в квартире равно: "  + windows.get(i));
    System.out.println("Количество лампочек в квартире равно:  " + lightbulb.get(i));

因此,第二个和第三个println-statemt在for循环之后运行,而我现在是house + 1,这导致超出范围异常。

答案 1 :(得分:1)

首先,在底部有你的最终打印语句,你只是迭代第一个print语句,因为你没有任何括号用于循环。我建议在循环中使用一个范围变量,这样如果你试图在for循环范围之外使用它就会告诉你它没有被声明,它可以避免像这样的混乱

for(int i=1; i<=house; i++) {
  ...
}

其次,将""添加到每个列表似乎非常多余,所以你可能应该删除它。数组列表是零索引的,因此使用list.get(0)访问第一个索引,这可能会消除对这些添加的需要。如果您仍然希望用户输入1,那么您在访问时可以减去1:list.get(house - 1)

第三,如果你确实删除了那些不需要的添加,你可以从0开始遍历列表,

for(i=0; i<house; i++) {
    System.out.println("Площадь квартиры " + i + "составляет " + area.get(i));
    System.out.println("Количество окон в квартире равно: "  + windows.get(i));
    System.out.println("Количество лампочек в квартире равно:  " + lightbulb.get(i));
}

最后,由于您每次都在home变量中存储相同的信息,因此这些多个列表似乎非常冗余。我假设ArrayList公寓旨在存储这些,但你没有使用它。因此,而不是所有这些单独的列表,只需将home存储在公寓列表中,并在需要时访问它的字段。这也是非常有效的,因为你可以获取一次回家,因为从列表中获取是一个相对昂贵的操作,访问它的字段将显着提高效率。此外,您可以使用相同的扫描仪。

public static void main(String[] args) {
    ArrayList apartment = new ArrayList();
    System.out.println("Введите количество квартир в здании.");
    Scanner sc = new Scanner(System.in);
    int house = sc.nextInt();
    for (int i=1; i<=house; i++) {
        Apartments home = new Apartments();
        System.out.println("Введите площадь квартиры " + i);
        home.area = sc.nextDouble();
        System.out.println("Введите колич1ество окон в квартире " + i);
        home.windows = sc.nextInt();
        System.out.println("Введите количество лампочек в квартире " + i);
        home.lightbulb = sc.nextInt();
        apartment.add(home)
    }
    for(int i=0; i<house; i++) {
        Apartments home = apartment.get(i);
        System.out.println("Площадь квартиры " + i + "составляет " + home.area);
        System.out.println("Количество окон в квартире равно: "  + home.windows);
        System.out.println("Количество лампочек в квартире равно:  " + home.lightbulb);
    }
}