Java Bufferedreader在循环内抛出NullPointerException
我的代码应该逐行读取一个文件,将每个文件放入一个名为:Java Bufferedreader在循环内抛出NullPointerException,java,Java,我的代码应该逐行读取一个文件,将每个文件放入一个名为:tuples,(tuples=ligne.split(“”;)的字符串数组中,然后将这些元组添加到arraylist,一行读取=arraylist的一个元素。 不幸的是,我的代码不起作用!我的缓冲读取器在我的循环中抛出一个NullPointerException! ExtractFile()方法第120行返回错误:tuples=ligne.split(“”) File File=new文件(“Department.txt”); 缓冲读取器;
tuples
,(tuples=ligne.split(“”;
)的字符串数组中,然后将这些元组添加到arraylist,一行读取=arraylist的一个元素。
不幸的是,我的代码不起作用!我的缓冲读取器在我的循环中抛出一个NullPointerException
!
ExtractFile()
方法第120行返回错误:tuples=ligne.split(“”)代码>
File File=new文件(“Department.txt”);
缓冲读取器;
打印输出;
弦线;
int-nbCols//my file.txt中的元数据数
字符串元数据[]=新字符串[nbCols];
字符串[]元组=新字符串[nbCols]//1个案例中的indique num ligne
ArrayList itemset=新的ArrayList();
公共ArrayList提取文件(){
试一试{
int i=1;
in=新的BufferedReader(新的文件读取器(文件));
而((ligne=in.readLine())!=null){
while(ligne.charAt(0)!=“1”){
ligne=in.readLine();//浏览直到找到第1行
}
元组=ligne.split(“”);
添加(元组);
System.out.println(Arrays.toString(itemset.get(0));
对于(i=2;i
您提供给我们的代码确实不可读,应该格式化以便于调试。相反,您可以尝试我在IDE上测试过的这个简单代码
package example;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
public class FileSplit {
public static void main(String[] args) {
ArrayList<String[]> phrases = new ArrayList<String[]>();
try{
BufferedReader in = new BufferedReader(new FileReader("Department.txt"));
String s;
while((s = in.readLine()) != null){
String[] words = s.split(" ");
phrases.add(words);
}
}catch(Exception e){
e.printStackTrace();
}
for(int i=0;i<phrases.size();i++){
for(int j=0;j<phrases.get(i).length;j++)
System.out.println(phrases.get(i)[j]);
}
}
}
包示例;
导入java.io.BufferedReader;
导入java.io.FileReader;
导入java.util.ArrayList;
公共类文件碎片{
公共静态void main(字符串[]args){
ArrayList短语=新建ArrayList();
试一试{
BufferedReader in=新的BufferedReader(新文件阅读器(“Department.txt”);
字符串s;
而((s=in.readLine())!=null){
字符串[]字=s.split(“”);
短语。添加(单词);
}
}捕获(例外e){
e、 printStackTrace();
}
对于(int i=0;i您是否使用不包含第1行的文件进行测试?如果是,则运行此命令,它将继续执行内部循环,尽管该值为null,从而在读取最后一行后出现异常。若要修复此问题,请将内部循环更改为If
像这样:
public ArrayList ExtractionFile() {
try {
int i = 1;
in = new BufferedReader(new FileReader(file));
ligne = in.readLine(); //It can be more readable to seperate the assignment and the condtion
while (ligne != null) {
if (ligne.charAt(0) != '1') {
ligne = in.readLine();//browse until line 1 is found
} else {
tuples = ligne.split(" ");
itemset.add(tuples);
System.out.println(Arrays.toString(itemset.get(0)));
for (i = 2; i < TuplesCount(); i++) {
ligne = in.readLine();
tuples = ligne.split(" ");// CETTE LIGNE SOULEVE L EXCEPTION
itemset.add(tuples);
System.out.println(Arrays.toString(itemset.get(i)));
}
}
}
} catch (IOException es) {
es.printStackTrace();
} catch (ArrayIndexOutOfBoundsException exepti) {
exepti.printStackTrace();
}
return itemset;
}
private int TuplesCount() {
return Arrays.asList(tuples).size();
}
public static void main(String[] args){
Main main = new Main();
main.ExtractionFile();
}
public ArrayList ExtractionFile(){
试一试{
int i=1;
in=新的BufferedReader(新的文件读取器(文件));
ligne=in.readLine();//将赋值和条件分开会更具可读性
while(ligne!=null){
if(线性字符(0)!=“1”){
ligne=in.readLine();//浏览直到找到第1行
}否则{
元组=ligne.split(“”);
添加(元组);
System.out.println(Arrays.toString(itemset.get(0));
对于(i=2;i
}
根据上面的几点,请格式化您的代码-这样更容易获得帮助!另外,请仔细阅读断点!A告诉您您的代码
在需要对象的情况下尝试使用null。这些操作包括:
- 调用空对象的实例方法。
在您的情况下,您告诉我们错误发生在
tuples = ligne.split(" ");
您正试图调用ligne
上的split
,鉴于上面的文档引用,这意味着ligne
此时为null
值得注意的是,这是该行的第二次出现,引发了异常
,因此它不像文件没有以1开头的行那样简单
为什么?
您需要使用调试器或大量的System.out.println
来说服自己ligne
的值在代码执行时是如何变化的,更重要的是,它在哪里变为null
在您的情况下-我们不知道tuplescont()
返回什么,但很可能是您在文件末尾之外的循环中不断迭代,因此在失败的那一行之前的那一行
ligne = in.readline();
可以返回null
,但您永远不会在该点检查该。请注意,循环的条件仅在循环的每次迭代后检查-因此,除了while
循环条件中位于顶部的条件外,对ligne=in.readline()的所有调用
可能返回null
,并且永远不会被检查。您应该让IDE缩进/格式化您的代码,以便于阅读和查看代码块的范围。要在eclipse.NPE中格式化代码Ctrl+shift+f
,非常容易捕获:只需在调试模式下启动程序,使用IDE静态搜索来查找变量的位置将ligne写入。然后设置断点并对错误readLine()
在流的末尾返回null。Yo
ligne = in.readline();