为什么Java在将数据存储到数组中时会出现运行时错误;至于;环

为什么Java在将数据存储到数组中时会出现运行时错误;至于;环,java,arrays,for-loop,Java,Arrays,For Loop,我想编写代码,读取存储为字符串变量的单词。程序应该循环遍历单词中的每个字符,并更新包含每个字母出现频率的数组 字母表中的字母(A到Z)可以由“freq[1]”到“freq[26]”引用 但是,当我试图运行我的程序时,我得到一个错误,上面写着: java.lang.ArrayIndexOutOfBoundsException:-64 位于ReadWords.main(ReadWords.java:17) 以下是我使用的代码: public class ReadWords { public

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

字母表中的字母(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
        }
    }
}
公共类ReadWords
{
公共静态void main(字符串[]args)
{
String line=“这是一行文字,不刺激”;
line=line.toLowerCase();
int[]freq=新的int[27];
对于(int i=0;i
因为您正在用字母读取空格字符(ASCII 32)。它的值是
32
,当你减去
96
,你会得到
-64
,显然不是一个有效的数组索引

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


您还需要跳过其他标点符号,其中
'
为ASCII值39,
为ASCII值46。

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

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

您还需要跳过其他标点字符,
为ASCII值39,
为ASCII值46。

您的错误 正如格特曼所说,你在分析频率的时候,包括了空间。只需添加一个if语句

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

for (int i = 1; i < freq.length; i++)
或者,如果您按照我所说的那样更改了
freq
数组的大小,并在位置0处设置了“a”的频率,请使用以下行:

System.out.println((char)(i + 97) + ": " + freq[i]);
你的错误 正如格特曼所说,你在分析频率的时候,包括了空间。只需添加一个if语句

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

for (int i = 1; i < freq.length; i++)
或者,如果您按照我所说的那样更改了
freq
数组的大小,并在位置0处设置了“a”的频率,请使用以下行:

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

我想最简单的方法是只检查小写字母(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
    }
}
publicstaticvoidmain(字符串[]args){
String line=“这是一行文字,不刺激”;
line=line.toLowerCase();
int[]freq=新的int[27];
对于(int i=0;i96
&&第1行字符(i)<123){
/*减去97以从0开始数组(值97)*/
int字母=line.charAt(i)-97;
频率[字母]+;
}
}
对于(int i=0;i
我想最简单的方法是只检查小写字母(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
    }
}
publicstaticvoidmain(字符串[]args){
String line=“这是一行文字,不刺激”;
line=line.toLowerCase();
int[]freq=新的int[27];
对于(int i=0;i96
&&第1行字符(i)<123){
/*减去97以从0开始数组(值97)*/
int字母=line.charAt(i)-97;
频率[字母]+;
}
}
对于(int i=0;i
很明显,int字母=line.charAt(i)-96;生成字母=-64。我不知道这意味着什么…@mikeyaworski现在已经添加了评论:)很明显,int-letter=line.charAt(I)-96;生成字母=-64。我不知道这意味着什么…@mikeyaworski现在添加了评论:)