首页 > 解决方案 > Split() 无法生成 java.lang.ExceptionInInitializerError 。如何消除此错误?

问题描述

我正在对文本文件的一行进行拆分,但是我收到错误
java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
at String[] num= firstline.split(","); 行。谁能告诉我哪里错了

public class split {
    private static java.io.File file;
    private static BufferedReader reader;
    static int  noOfLines=0;
    
    static {
        try {
            file = new java.io.File("/home/madhu95/Desktop/data.txt");
            reader = new BufferedReader(new FileReader(String.valueOf(file)));
            while (reader.readLine() != null) {
                noOfLines++;
            }
            System.out.println(noOfLines);
            String firstline=reader.readLine();
            String[] num= firstline.split(",");
            int numberofmobile=Integer.parseInt(num[0]);
            System.out.println(numberofmobile);
            int numberofDept=Integer.parseInt(num[1]);
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
  
    
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}

标签: javaeclipse

解决方案


while (reader.readLine() != null) {
       noOfLines++;
}

这会消耗流。完成此循环后,您将位于文件的末尾。

String firstline=reader.readLine();

所以这是一个谎言——这不是第一行。不再。通过数行,您不再存在。事实上,firstline永远都会在null这里。

String[] num= firstline.split(",");

.它左边的东西在哪里null,给你一个 NPE。你没有明白这一点,所以你的初始化失败了。不要捕获该异常 - 通过计算行数来解决您转发整个文件的问题。


编辑:添加一个最有可能解决所有问题的解决方案。

鉴于您想在处理它们之前知道行数,您要么需要读取文件两次,要么完全重写您的逻辑以不再需要提前知道行数。复杂,因此,相反,如果您不处理文件,但处理 a List<String>- 它知道它有多少行(list.size()将为您提供该信息),该怎么办。然后,首先将文件读入行列表,然后从那里获取:

import java.nio.file.*;

List<String> lines =
 Files.readAllLines(Paths.get("/Path/to/your/data.txt"));
// ....

推荐阅读