是什么导致数组越界错误,我该如何清理我的代码?

时间:2014-04-14 19:49:45

标签: java

该程序应该将字母表中的每个字母归为其在Scrable中的值,获取文本文件,处理单个单词,并打印具有最高值平均值的单词(平均值为所有单词的总值)字符,字母和非字母,除以这些字符的数量)。我的代码似乎几乎完整,但它报告了一个超出范围的错误,我不知道为什么。

这是错误:java.lang.ArrayIndexOutOfBoundsException: -52

这是类驱动程序:

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

public class ScrabbleDriver{
    public static void main(String[] args) throws IOException{
    try{
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter text file ");
        String fileName = scan.next();
        Scrabble s = new Scrabble(fileName);
        s.readLines(); 
        s.report(); 
    }
    catch(Exception e){
        System.out.println(e);}
    }
}

这是构造函数类:

import java.io.IOException;
import java.util.StringTokenizer;

public class Scrabble extends Echo {

    private int [] scores = {1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10};
    private double maxScore = 0;
    private String maxScoreWord = " ";

    public Scrabble(String fn) throws IOException {
        super(fn);
    }

    public void processLine(String line) {
        line = line.toLowerCase();
        StringTokenizer s = new StringTokenizer(line);
        while (s.hasMoreTokens()) {
            processToken(s.nextToken());
        }
    }

    public void processToken(String token) {
        double wordScore = 0;
        for (int n = 0 ; n < token.length() ; n++) {
            char j = token.charAt(n);
            if ((j == '!') || (j == ',') || (j == '.'))
                wordScore = wordScore;
            else {
                int m = (int) (j - 'a');
                if (m <= 25) {
                    wordScore = wordScore + scores[m];
                }
            }
        }
        wordScore = (wordScore / token.length());
        if (wordScore > maxScore) {
            maxScore = wordScore;
            maxScoreWord = token;
        }
    }

    public void report() {
        System.out.print("Winner: " + maxScoreWord + "   " + "Score: " + maxScore);
    }
}

这是Echo类:

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

public class Echo {

    String fileName; // external file name
    Scanner scan; // Scanner object for reading from external file

    public Echo(String fn) throws IOException {
        fileName = fn;
        scan = new Scanner(new FileReader(fileName));
    }

    public void readLines() { // reads lines, hands each to processLine
        while (scan.hasNext()) {
            processLine(scan.nextLine());
        }
        scan.close();
    }

    public void processLine(String line) { // does the real processing work
        System.out.println(line);
    }
}

如果需要更多信息,请与我们联系。

违规阻止

int m = (int)(j - 'a');
if(m <= 25){

wordScore = wordScore + scores [m];

}

2 个答案:

答案 0 :(得分:2)

您的错误在scores[m]。如果您选择超出scores长度(或小于)的数组位置,那么您将获得Out of Bounds Exception。您需要先检查阵列的长度。计算j - 'a'产生负数。

最后,确保m不小于零。您正在检查它是否小于25。

以下是指向ASCII table的链接。有char小于&#39; a&#39;在表中。因此,您需要调整逻辑。

由于您只使用大概小写字母,因此在减去之前需要确保字符值介于97和122之间。所以,你可以通过说:

来比较这些字母
if (j < 'a' || j > 'z')
{
   continue;
}

答案 1 :(得分:1)

可能m是否定的。你只能测试25或更少。

在进行计算之前,请确保j(为什么将其命名为j?)代表一封信。

if (j < 'a' || j > 'z') {
    continue;
}

或者,或者,使用标记器确保奇怪的字符不是“单词”的一部分。取决于你想去的地方。