【问题标题】:Issues with adding elements to an array and switch statements, with error ArrayIndexOutOfBoundsException将元素添加到数组和 switch 语句的问题,错误 ArrayIndexOutOfBoundsException
【发布时间】:2018-12-13 01:04:01
【问题描述】:

下面是我正在编写的从 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)

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

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

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

【问题讨论】:

    标签: java arrays switch-statement


    【解决方案1】:

    当你这样做时:

    int[] month = {tempCount};
    

    这会创建一个只有一个元素的ArraytempCount。你想要的:

    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 时,它都会递增。我建议使用List,这样您就可以简单地使用add() 方法并将其添加到List 的末尾。 ArrayList 也没有固定大小,因此您不必事先声明大小。

    【讨论】:

    • 哇,多么愚蠢的错误!谢谢!文本文件中的第一个整数是数据条目的数量(因此 tempCount),以下 3 行纯粹用于文本文档的格式。我的意图是让该循环跳过这些行,以便它从数据开始的行开始。这是不正确的吗?
    • @SamPhinney 不,这不是错误的,我只是认为您可能是不小心跳过了重要数据。
    【解决方案2】:

    你不能这样做i &lt;= tempCount;,因为你定义的数组只允许从 0 到小于 tempCount;

    应该for (int i = 0; i &lt; tempCount; i++)

    第二点是int[] month = {tempCount};,这意味着您只定义该数组有 1 个元素?它不正确地定义数组;应该是这样的int[] month = new int[2]; // create an month array store 2 elements

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多