Как можно исправить индекс массива за пределами исключения - PullRequest
1 голос
/ 06 мая 2019

Это домашнее задание для латинского переводчика java pig.Я новичок в 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;
    }

Сейчас я просто получаю сообщение об ошибке и не знаю, что делать.Предполагается, что это запись в файл, но я просто пытался вывести его прямо сейчас, чтобы посмотреть, работает ли он, но я не захожу так далеко из-за ошибки.спасибо

Ответы [ 2 ]

2 голосов
/ 06 мая 2019

Рассмотрим следующую часть вашего кода:

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]; внутри своей петли?

1 голос
/ 06 мая 2019

Анис Р. правильно, но ответить на ваш следующий вопрос (как перевести каждое слово):

После прочтения каждого слова вы должны добавить его в любой массив (или ArrayList, или аналогичный). Затем вы можете передать массив всех слов вашему классу переводчика.

Если вы хотите, чтобы каждое слово читалось в одну строку, как кажется, что вы пытались сделать это в своем коде, вам нужно изменить

word = fileReader.next();

до

word += fileReader.next();

это добавит следующее слово в строку.

Редактировать: спасибо Анис R, должно быть

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

Чтобы правильно включить пробелы.

Чтобы ответить на ваш дополнительный вопрос о ArrayLists: Создайте ArrayList для таких слов:

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

Затем в цикле while(fileReader.hasNext()) измените код на list.add(fileReader.next());

Это добавит каждое слово (без пробелов) в список - каждое слово будет отдельной строкой и уникальным индексом в списке. Затем вы можете перебрать список (вы можете найти длину, используя list.size()), чтобы перевести каждое слово. Поскольку пробелы не включены, при выводе результатов перевода вы захотите напечатать пробелы между каждым словом.

...