【问题标题】:How can correct the array index out of bounds exception如何纠正数组索引越界异常
【发布时间】:2019-09-23 14:44:23
【问题描述】:

这是一个 java pig latin 翻译作业的作业。我是 java 新手,在解决这个问题时遇到了很大的困难。当我输入要读取和写入的文件时,我得到一个数组索引越界错误。在这一点上,我什至不确定代码的翻译部分是否能正常工作。任何有关纠正错误和翻译代码的帮助将不胜感激。

    while(true){
        System.out.println("Enter a text file to translate to Pig Latin. Quit to end.");
        fileName = keyboard.nextLine();
        if (fileName.equalsIgnoreCase("quit")){
            break; //End program.
        }
        System.out.println("Enter a file to write the translated file to.");
        outputFile = keyboard.nextLine();
        if (outputFile.equalsIgnoreCase("quit")){
            break; //End program.

        }


        fileToTranslate = new File(fileName);
        try {
            fileReader = new Scanner(fileToTranslate);
        } catch (FileNotFoundException ex) {
                //Logger.getLogger(PigLatinTranslatorKukuruda.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("File does not exist. Enter a new file.");
        }
        while(fileReader.hasNext()){
            word = fileReader.next();
        }
        fileReader.close();

        System.out.println(translator(word));
        }
}

    public static String translator(String string){
        String[] wordsToTranslate = string.split(" ");
        String word;
        String translatedString = " ";
        int first = 0;

        for(int i = 0; i <= wordsToTranslate.length-1; i++){
            word = wordsToTranslate[1];
            if ((word.charAt(0) == 'a') || (word.charAt(0) == 'e') || (word.charAt(0) == 'i') || 
                   (word.charAt(0) == 'o') || (word.charAt(0) == 'u') || (word.charAt(0) == 'A') ||
                    (word.charAt(0) == 'E') || (word.charAt(0) == 'I') || (word.charAt(0) == 'O') || 
                    (word.charAt(0) == 'U')){
                translatedString = word + "yay";
            }
            else{
                for(int j = 0; j <= word.length()-1; j++){
                    if ((word.charAt(j) == 'a') || (word.charAt(j) == 'e') || (word.charAt(j) == 'i') ||
                            (word.charAt(j) == 'o') || (word.charAt(j) == 'u') ||
                            (word.charAt(j) == 'A') || (word.charAt(j) == 'E') || 
                            (word.charAt(j) == 'I') || (word.charAt(j) == 'O') ||
                            (word.charAt(j) == 'U')){
                    if (first == 0){
                        translatedString = word.substring(j) + word.substring(0, j) + "ay";

                        first = 1;
                    }
                }
                }
            }
        }
        return translatedString;
    }

现在我刚刚收到错误消息,不知道该怎么办。这应该写入文件,但我现在只是想输出它以查看它是否有效,但由于错误,我没有走那么远。谢谢

【问题讨论】:

  • 应该word = wordsToTranslate[1];word = wordsToTranslate[i]; 吗?事实上,如果字符串被拆分后只有一个单词,它会给出一个索引越界错误。

标签: java exception indexoutofboundsexception


【解决方案1】:

考虑以下代码部分:

while(fileReader.hasNext()){
    word = fileReader.next();
}

fileReader.close();
System.out.println(translator(word));

您的扫描仪正在逐字读取(因为.next())。

在您的 while 循环中,每次迭代都会覆盖 word 的值,因此在循环结束时,word 将等于 文件的最后一个字

因此,您对translate(word) 的调用只会将最后一个单词作为参数传递。也就是一个字。因此word = wordsToTranslate[1]; 肯定会抛出IndexOutOfBounds 异常,因为没有第二个单词。

另外,我相信您的意思是在循环中使用 word = wordsToTranslate[i];

【讨论】:

  • 是的,当我将其更改为 word = wordsToTranslate[i] 时,它只翻译了文件的最后一个单词。然后我将其更改为 word = fileReader.nextLine();我现在得到字符串索引越界异常。我没有看到如何翻译和打印文件的每个单词。你对此有什么建议吗?谢谢
【解决方案2】:

Anis R. 是正确的,但要回答您的下一个问题(如何翻译每个单词):

读入每个单词后,您应该将其添加到任何数组(或 ArrayList 或类似的)中。然后,您可以将所有单词的数组传递给您的翻译类。

如果您希望将每个单词读入一个字符串,就像您在代码中尝试过的那样,您需要更改

word = fileReader.next();

word += fileReader.next();

这会将下一个单词附加到字符串中。

编辑:感谢 Anis R,它必须是

word += " " + fileReader.next();

正确包含空格。

回答关于 ArrayLists 的后续问题: 为这样的单词创建一个 ArrayList:

ArrayList<String> list = new ArrayList<String>();

然后,在您的 while(fileReader.hasNext()) 循环中,将代码更改为 list.add(fileReader.next());

这会将每个单词(不带空格)添加到列表中 - 每个单词将是一个单独的字符串,并且是列表中的唯一索引。然后您可以遍历列表(您可以使用list.size() 找到长度)来翻译每个单词。由于不包含空格,因此当您打印出翻译结果时,您需要在每个单词之间打印空格。

【讨论】:

  • 差不多。你需要在word += fileReader.next();中的单词之间添加空格,变成word += " " + fileReader.next();(可能在第一次迭代中除外)。
  • 谢谢。我试过这样做,但我仍然得到字符串索引超出范围异常。如果我要将文本文件添加到 ArrayList 有没有办法在空格处拆分它?
  • 我已经编辑了我的答案 - 检查是否能回答您的问题。如果是,请标记为已接受的答案。
猜你喜欢
  • 2016-08-03
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 2015-06-28
相关资源
最近更新 更多