Ошибка индекса CharAt при чтении текстового файла на Java - PullRequest
0 голосов
/ 20 ноября 2018

Я получаю некоторые сбивающие с толку ошибки, когда я перебираю весь этот текстовый файл enable1 (https://raw.githubusercontent.com/dolph/dictionary/master/enable1.txt), чтобы проверить, соответствует ли он английскому слову «rule» перед I, кроме E). Я заметил кодуспешно, когда я удаляю "-1" из charAt (indexEI - 1), который я пометил ниже (****).

Любые идеи, почему это может быть? Ошибки просто сказать "на java.lang.String.charAt (String.java: 658) "," Main.ibeforeE "и" at Main.main "в кажущихся случайными точках в разделе" e "итерации. Затем он говорит var \ cache \ executor-snippets \run.xml: 53: Java вернул: 1 BUILD FAILED в самом конце.

Я довольно новичок в Java, поэтому любая другая конструктивная критика также приветствуется. Спасибо!

Main:

import java.util.Scanner;
import java.util.ArrayList;

public class Main {

public static void main(String[] args) {

    EnableWord test = new EnableWord();
    test.EnableWords();


    Scanner read = new Scanner(System.in);
    ArrayList<String> list = new ArrayList<String>();
    list = test.getList();


    int x = 0;
    int falseCounter = 0;

    while (x < list.size()) {
        System.out.print(list.get(x) + ": ");

        String input = list.get(x);

        if (input.equals("x")) {
            break;
        } else {
            System.out.println(iBeforeE(input));
                if(!iBeforeE(input)) {
                    falseCounter++;
                }
            x++;
        }
    }

    System.out.println(falseCounter);
}

public static boolean iBeforeE(String input) {


    if (!input.contains("ie") && !input.contains("ei")) {
        return true;
    }

    if (input.contains("ie")) {
        int indexIE = input.indexOf("ie");
        Character searchIE = input.charAt(indexIE - 1);
        if (!searchIE.toString().equals("c")) {
            return true;
        }

    } else if (input.contains("ei")) {
        int indexEI = input.indexOf("ei");
        ****Character searchEI = input.charAt(indexEI - 1);****
        if (searchEI.toString().equals("c")) {
            return true;
        }
    }


    return false;

}

Класс EnableWord:

}


import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class EnableWord {

private ArrayList<String> list;
private Scanner s;
private File file;

public EnableWord() {
}

public void EnableWords() {

    try {
        this.s = new Scanner(this.file = new File("enable1.txt"));
    } catch (FileNotFoundException ex) {
        Logger.getLogger(EnableWord.class.getName()).log(Level.SEVERE, null, ex);
    }
    this.list = new ArrayList<>();
    while (s.hasNext()) {
        list.add(s.next());
    }
    s.close();

}

public void printWords() {

    for (String word : list) {
        System.out.println(word);
    }

}

public ArrayList<String> getList() {

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

    for (String word : list) {
        newList.add(word);

    }
    return list;
}

}

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

В вашем списке есть слова, которые начинаются с ei (например, eicosanoid). Когда ваша программа получает эти слова, она находит индекс 'ei' равным 0. Таким образом, значение "indexEI - 1" является отрицательным 1, недопустимый индекс.

Вы можете исправить это, проверив, равен ли indexEI> 0, прежде чем пытаться проверить предыдущий символ 'c':

if (indexEI == 0 || input.charAt(indexEI - 1).toString().equals("c")) {
    return true;
}
0 голосов
/ 20 ноября 2018

Как только слово начинается с 'ie' или 'ei', input.charAt(indexIE - 1) выдаст ошибку, поскольку indexIE означает 0.

Я не уверен, что вы хотите сделать в вашемкод, но нужна какая-то проверка

if (indexIE == 0) {

} else {
    //current code
}
...