java - 名字和姓氏缓冲的阅读器给我带来了麻烦
问题描述
我已经修复了许多其他问题,但是在修复了一个我认为是最后一个错误的问题之后,我遇到了 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)
解决方案
for (int i = 0; i <= line.length(); i++) {
if (line.contains(names.get(i))) {
所以基本上 i 从 O 到 line.length() (行中的字符数),你用它来用 name.get(i) 来匹配你的名字,绝对没有理由是相同的大小(它更多的是数字第一行的行数)
但是你为什么不调试你的代码呢?您收到的错误表明错误在 TestScanner 第 32 行调用 get 方法。它已经说错误在哪里!
您甚至可以使用调试器重新运行该程序,并在引发异常时要求它停止,以便它准确地停止在正确的位置,您可以查看各种变量。
推荐阅读
- javascript - 如何更改数组状态容器中的对象属性?React Hooks 使用状态
- git - 仅当没有其他提交更新由樱桃挑选的提交更新的文件时,如何进行挑选?
- vue.js - 为什么计算属性在 Vuetify 日期选择器上不能作为 v-model 工作?
- javascript - 解析Paypal付款
- angular - 向下滚动时隐藏 div,在显示时显示 div
- flutter - 错误:“预期 1 个位置参数,但找到 0 个”颤振飞镖错误
- javascript - 在 JavaScript 代码错误中实现的设计模式单例
- javascript - 在服务器上提交数据后本地存储不起作用
- angular - Angular PrimeNG Autocomplete如何传递对象的ID值
- azure - 与实体框架的连接在本地工作,在 Azure 中工作,但现在我得到“无效的对象名称......”