首页 > 解决方案 > 名字和姓氏缓冲的阅读器给我带来了麻烦

问题描述

我已经修复了许多其他问题,但是在修复了一个我认为是最后一个错误的问题之后,我遇到了 Null 指针异常。

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 约翰·史密斯

您输入的内容:比利·史密斯、约翰·史密斯、

它的重点是扫描文件以查找数组列表中的名字和姓氏列表,然后输出数字和姓名。如果我在整个列表中按顺序排列,该程序就可以工作,但如果我不这样做,它就会给我这个。如果 if 语句找到匹配项,我尝试将 reader.reset() 放入,如果没有,则读取另一行,但这不起作用

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)

标签: javabufferedreader

解决方案


            for (int i = 0; i <= line.length(); i++) {
                if (line.contains(names.get(i))) {

所以基本上 i 从 O 到 line.length() (行中的字符数),你用它来用 name.get(i) 来匹配你的名字,绝对没有理由是相同的大小(它更多的是数字第一行的行数)

但是你为什么不调试你的代码呢?您收到的错误表明错误在 TestScanner 第 32 行调用 get 方法。它已经说错误在哪里!

您甚至可以使用调试器重新运行该程序,并在引发异常时要求它停止,以便它准确地停止在正确的位置,您可以查看各种变量。


推荐阅读