Буферизованный считыватель имени и фамилии доставляет мне проблемы - PullRequest
0 голосов
/ 10 июля 2020

Я исправил много других проблем, но после исправления той, которая, по моему мнению, была последней ошибкой, возникла исключительная ситуация с нулевым указателем.

package com.Text.Scanner.java;

import java.util.ArrayList;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;


public class TextScanner {
    public static void main(String ...args) throws IOException{
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter names for parsing");
        String input = sc.nextLine();
        ArrayList<String> names = new ArrayList<String>();
        for (int i = 0;i<=input.length();i++) {
            names.add(input.substring(0, input.indexOf(",")));
            input = input.substring(input.indexOf(",")+1);
        }
        System.out.println(names);
        // handles the string import to arraylist

        BufferedReader reader;
        try {
            reader = new BufferedReader(new FileReader("sample.txt"));
            //finds file
            String line = reader.readLine();
            //reads line
            while (line != null) {
                for (int i = 0; i <= line.length(); i++) {
                    if (line.contains(names.get(i))) {
                        //gets name from array to scan line for
                        System.out.println(line.substring(4, line.indexOf(names.get(i)) + names.get(i).length()));
                        //controls length
                        line = reader.readLine();
                        }
                    }
                }
            reader.close();
           }
                catch (IOException e) {
             e.printStackTrace();
        }
    }
}

Цель здесь - сканировать каждую строку в поисках имени ( первая и последняя), затем напечатайте число в стороне от их имени в текстовом файле.

первая строка: 1234 Билли Смит

вторая строка: 5678 Джон Смит

что вы вводите: Билли Смит, Джон Смит,

Смысл этого в том, чтобы просканировать файл на предмет списка имен и фамилий в arrayylist, а затем вывести числа и имя. Программа работает, если я go по порядку во всем списке, но если нет, то дает мне это. Я попытался поставить reader.reset (), если оператор if находит совпадение, а затем, если нет, он читает другую строку, но это не работает

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3
    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:373)
    at java.base/java.util.ArrayList.get(ArrayList.java:426)
    at com.Text.Scanner.java.TextScanner.main(TextScanner.java:32)

1 Ответ

0 голосов
/ 10 июля 2020
            for (int i = 0; i <= line.length(); i++) {
                if (line.contains(names.get(i))) {

Итак, в основном я перехожу от O к line.length () (количество символов в строке), и вы используете его, чтобы сопоставить свои имена с name.get (i), что абсолютно нет причин быть одинакового размера (это больше количество строк в первой строке)

Но почему вы не отлаживаете свой код? В полученной вами ошибке говорится, что ошибка находится в строке 32 TestScanner, вызывающей метод get. Он уже говорит, где ошибка!

Вы можете даже перезапустить эту программу с помощью отладчика и попросить ее остановиться при возникновении исключения, чтобы она остановилась точно в нужном месте, и вы могли посмотреть на различные переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...