gpt4 book ai didi

java - 是什么导致数组越界错误以及如何清理我的代码?

转载 作者:行者123 更新时间:2023-12-01 23:03:59 25 4
gpt4 key购买 nike

该程序应该在 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);
}
}

如果需要更多信息,请告诉我。

违规区 block

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

wordScore = wordScore + 分数[m];

}

最佳答案

您的错误位于scores[m]中。如果您选择的数组位置超出了(或小于)scores 的长度,那么您将收到越界异常。您需要首先检查数组的长度。计算 j - 'a' 生成负数。

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

这里是 ASCII table 的链接。表中有char小于'a'。因此,你需要调整你的逻辑。

由于您只使用小写字母,因此在相减之前您需要确保字符值在 97 到 122 之间。因此,您可以这样比较字母:

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

关于java - 是什么导致数组越界错误以及如何清理我的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23069006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com