IndexOutOfBoundsException при использовании функции jsoup get () - PullRequest
0 голосов
/ 03 декабря 2018

В основном моя функция загружает веб-страницу из https://meta.wikimedia.org/wiki/Table_of_Wikimedia_projects и берет таблицу так, чтобы она печатала название языка, если определенная ячейка в ее строке не пуста.Вот код:

public static void getLanguagesFromProject(String project) {
    String html = "https://meta.wikimedia.org/wiki/Table_of_Wikimedia_projects";
    try {
        Document doc = Jsoup.connect(html).get();
        Elements tableElements = doc.select("table.wikitable.sortable");
        Elements rows = tableElements.select("tr");
        int column = 0;
        switch (project) {
            case "Wikipedia":
                column = 3;
                break;
            case "Wiktionary":
                column = 4;
                break;
            case "Wikibooks":
                column = 5;
                break;
            case "Wikinews":
                column = 6;
                break;
            case "Wikiquote":
                column = 7;
                break;
            case "Wikisource":
                column = 8;
                break;
            case "Wikiversity":
                column = 9;
                break;
            case "Wikivoyage":
                column = 10;
                break;
            default:
                break;
        }
        for (Element row : rows) {
            Elements cols = row.select("td");
            System.out.println(cols.get(column).text());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Что происходит, когда я получаю ошибку IndexOutOfBoundsException, особенно во втором выражении в цикле for: System.out.println(cols.get(column).text()); Есть идеи, что нужно сделать?Редактировать: ошибка более подробно:

java.lang.IndexOutOfBoundsException: Index 3 out-of-bounds for length 0 at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248) at java.base/java.util.Objects.checkIndex(Objects.java:372) at java.base/java.util.ArrayList.get(ArrayList.java:440) at com.company.Main.getLanguagesFromProject(Main.java:76) at com.company.Main.main(Main.java:11)

1 Ответ

0 голосов
/ 06 декабря 2018

обратите внимание, что вы выбрали все <tr>

Elements tableElements = doc.select("table.wikitable.sortable");
Elements rows = tableElements.select("tr");

, включая заголовки.Тогда его первой строкой будет заголовок, который не имеет <td>, затем на первой итерации он получил исключение IndexOutOfBoundsException при попытке получить 3-й элемент <td>, потому что его там не существует.

Просто исключите первый <tr> заголовок

// start from 1, exclude 0 which is a header without td's
for (int i = 1; i < rows.size(); i++) {
    Elements cols = rows.get(i).select("td");
    System.out.println(cols.get(column).text());
}
...