Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Bufferedreader在循环内抛出NullPointerException_Java - Fatal编程技术网

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();