向数组和switch语句添加元素的问题,错误ArrayIndexOutOfBoundsException

时间:2018-12-13 01:04:01

标签: java arrays switch-statement

下面是我正在编写的程序的开头,该程序用于从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的调试器,我可以看到icount变量正确地递增。

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

  

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

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

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

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

2 个答案:

答案 0 :(得分:4)

当您这样做:

int[] month = {tempCount};

这将创建仅包含一个元素Array的{​​{1}}。您想要:

tempCount

这将创建一个 size int[] month = new int[tempCount];

Array

还请注意此循环:

tempCount

正在调用for (int i = 0; i < 3; i++) { input.nextLine(); } ,而没有解决任何问题。

  

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

是的,这是正确的,因为您始终将其设置为nextLine(),只要您将其添加到任何i中,它就会增加。我建议您使用Array,这样您就可以简单地使用List方法并将其添加到add()的末尾。另外,ArrayList的大小也不固定,因此您不必事先声明大小。

答案 1 :(得分:1)

您不能像这样i <= tempCount;那样做,因为您定义的数组只允许从0到小于tempCount;

应该{​​{1}} <=仅小于此处,否则您必须增加数组大小(第一个点)

第二点是for (int i = 0; i < tempCount; i++),这意味着您仅定义该数组具有1个元素?定义数组的方式不正确。应该是这样的int[] month = {tempCount};

希望有帮助