为什么在使用“for”循环将数据存入数组时,Java会给出运行时错误?

时间:2013-11-20 22:16:54

标签: java arrays for-loop

我想编写一个读取存储为String变量的单词的代码。程序应循环遍历单词中的每个字符,并更新包含每个字母出现频率的数组。

字母表中的字母(A到Z)可以通过“freq [1]”引用“freq [26]”。

然而,当我尝试运行我的程序时,我收到一条错误消息:

java.lang.ArrayIndexOutOfBoundsException:-64     在ReadWords.main(ReadWords.java:17)


以下是我使用的代码:

public class ReadWords
{
    public static void main (String[] args)
    {
        String line = "This is a line of text. That's not exciting";
        line = line.toLowerCase();
        int[] freq = new int[27];

        for (int i = 0; i < line.length(); i++)
        {
            int letter = line.charAt(i) - 96;
            freq[letter]++;
        }

        for (int i = 0; i < freq.length - 1; i++)
        {
            System.out.println(freq[i]);  //prints all elements in the array
        }
    }
}

3 个答案:

答案 0 :(得分:3)

因为您正在使用字母读取空格字符(ASCII 32)。其值为32,当您减去96时,您会得到-64,显然不是有效的数组索引。

我认为你不想计算空格,所以跳过它们;不要处理它们。

您还希望跳过其他标点符号,'为ASCII值39,.为ASCII值46。

答案 1 :(得分:1)

您的错误

就像rgettman所说,你在频率分析中包含了空格。只需添加一个if语句。

for (int i = 0; i < line.length(); i++)
{
    int letter = line.charAt(i) - 96;
    if (letter > 0 && letter < 27) freq[letter]++;
}

if (letter > 0 && letter < 27)确保您char中的String实际上是来自a - z的信件


有用的观点

,在你的第二个for-loop中,它不会显示'z'的频率,它会将频率显示为数组中的位置0,它不保留任何内容(位置1是'a')。

你需要改变这个:

for (int i = 0; i < freq.length - 1; i++)

到此:

for (int i = 1; i < freq.length; i++)

这样它包括元素27,它是freq[26],它是'z'频率所在的位置。它也会忽略元素1,即freq[0]。试试吧。

或者你可以将freq数组的大小更改为26,然后从line.charAt(i)中减去97,然后更改我在第一个时提供的if-statement for-loop
if (letter > -1 && letter < 26)。然后使用for (int i = 0; i < freq.length; i++)


显示频率为

的字母

使用此行代码显示与频率对应的字符:

System.out.println((char)(i + 96) + ": " + freq[i]);

或者,如果你按照我所说的改变了freq数组的大小,并将位置0的频率设为'a',请使用以下行:

System.out.println((char)(i + 97) + ": " + freq[i]);

答案 2 :(得分:1)

我想最简单的方法是只检查小写字母(97-122 ASCII值)。

以下是您的代码的修改版本。

public static void main(String[] args) {
    String line = "This is a line of text. That's not exciting";
    line = line.toLowerCase();
    int[] freq = new int[27];

    for (int i = 0; i < line.length(); i++) {

/*Only use lower case alphabets ranging from 97 to 122. 
The below if should omit all other unwanted characters from your string.*/

        if (line.charAt(i) > 96 
                && line.charAt(i) < 123) {

/* Subtract by 97 to start your array from 0 for a(value 97)*/

            int letter = line.charAt(i) - 97;
            freq[letter]++;
        }
    }

    for (int i = 0; i < freq.length - 1; i++) {
        System.out.println((char)(i+97) + " : " + freq[i]); // prints all elements in the array
    }
}