首页 > 解决方案 > 将元素添加到数组和 switch 语句的问题,错误 ArrayIndexOutOfBoundsException

问题描述

下面是我正在编写的从 weather.txt 读取温度信息的程序的开头,它以这种格式列出日期和温度数据:01/01/1941 38 25并分别表示日期、最低温度和最高温度。weather.txt 中的第一个条目是数据条目的总数,接下来的 3 行用于格式化:

import java.io.*;
import java.util.*;

public class WeatherAnalysis {
public static void main(String[] args) throws FileNotFoundException {
    Scanner input = new Scanner(new File("weather.txt"));
    input.useDelimiter("[/ \t\n\r]+");

    int tempCount = input.nextInt();
    int[] month = {tempCount};
    int[] day = {tempCount};
    int[] year = {tempCount};
    int[] tmax = {tempCount};
    int[] tmin = {tempCount};

    System.out.println("There are " + tempCount + " entries.");
    for (int i = 0; i < 3; i++) {
        input.nextLine();
    }
    int count = 0;
    for (int i = 0; i <= tempCount; i++) {
        if (count < 5) {
            switch(count) {
            case 0:
                month[i]=input.nextInt();
                break;
            case 1:
                day[i]=input.nextInt();
                break;
            case 2:
                year[i]=input.nextInt();
                break;
            case 3:
                tmax[i]=input.nextInt();
                break;
            case 4:
                tmin[i]=input.nextInt();
                break;
            }  
            count++;
        }
        else {
            count = 0;
        }


    }
}
}

我已经初始化了 5 个整数数组。由于数据是静态格式化的,所以我打算通过固定格式读取每条数据。为此,我创建了一个带有计数器的 switch 语句。

我的想法是count变量会找到对应的情况,将元素添加到数组中,中断并在获取下一个输入之前递增计数器。使用 Eclipse 的调试器,我可以看到 myicount变量正确递增。

但是,一旦调试器读取day[i]=input.nextInt();我就会遇到......

线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 1 在 WeatherAnalysis.main(WeatherAnalysis.java:29)

诚然,我很难掌握数组。我知道我的初始化很差。对于初学者来说,它们太高了(有 30k 数据条目),但我不愿将其设置为任意值,因为担心它太小。

另外......使用这种方法,我想如果我打印出我的数组,我会有很多随机跳跃。我相信元素最初设置为 0,所以我的想法是我的数组最终可能会像这样0,0,0,46,0,0,0,42

任何见解将不胜感激。这是我在这里的第二篇文章,请原谅任何格式,谢谢!

标签: javaarraysswitch-statement

解决方案


当你这样做时:

int[] month = {tempCount};

这将创建一个Array只有一个元素,tempCount。你自找的:

int[] month = new int[tempCount];

这将创建Array一个大小 tempCount


还要注意这个循环:

for (int i = 0; i < 3; i++) {
    input.nextLine();
}

正在调用nextLine()而不解决任何问题。

我相信元素最初设置为 0,所以我的想法是我的数组最终可能会像 0,0,0,46,0,0,0,42 等。

是的,这将是正确的,因为您始终将其设置为i,每当您添加到任何Array's 时,它都会增加。我建议使用List's,以便您可以简单地使用该add()方法并将其添加到List. 此外ArrayList's 没有固定大小,因此您不必事先声明大小。


推荐阅读