1

我在这部分代码上花费了无数个小时,这给了我一个空指针异常。我不明白它为什么会发生或如何阻止它。我已经尝试过之前在 stackoverflow 上发布的所有方法。这是读取数据文件并将每一行放入哈希图中的函数。

public ArrayList<HashMap<String, String>> readDataFromFile(){
    this.openFileForReading();
    ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String,String>>();
    try{
        String line;

        while ((line = this.reader.readLine()) != null){ 

            while (!(line.equals(""))){

                if (line.equals("[type = book]")){
                    HashMap<String, String> data= new HashMap<>();
                    line = this.reader.readLine();

                    while (!(line.equals(""))){<----this is where the null exception error is

                        String tokens[] = line.split("=");
                        data.put(tokens[0], tokens[1]);
                        System.out.println(tokens[0] + " " + tokens[1]);
                        line = this.reader.readLine();

                    }
                   list.add(data);
                }
                else{
                    break;
                }
            }

        }
    }
    catch (IOException exception) {
        list = null;
        System.err.println("(FileIO): " + exception);            
    }
    // Close the file when we have finished reading or if an error occurs
    finally {
        try {
            this.reader.close();                
        } catch (IOException exception) {
            System.err.println("(FileIO): " + exception);
        }
    }

    return list;
}

然后我用这个在 main 中运行它:

public static void main (String args[]) {                                
    FileIO fileIO = new FileIO(DATA_FILE_PATH);
    ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String,String>>();
    list = fileIO.readDataFromFile();

}
run:

callnumber“QA76.73.J38S265”作者“Walter Savitch,Ken​​rich Mock”标题“Absolute Java”出版商“Addison-Wesley”年份“2009”callnumber“P98.C6116”标题“计算语言学”线程“main”java 中的异常。 lang.NullPointerException 组织“计算语言学协会”在 librarysearch.FileIO.readDataFromFile(FileIO.java:160) 年“2008”在 librarysearch.FileIO.main(FileIO.java:405) Java 结果:1 构建成功(总时间: 1秒)

我在发生错误的代码中写了。为什么会这样?我不明白,如果任何人都可以请帮助,将不胜感激。

4

4 回答 4

3

您正在使用新行而不检查 null:

 HashMap<String, String> data= new HashMap<>();
 line = this.reader.readLine(); <--- i mean this, and line can be null

 while (!(line.equals(""))){<----this is where the null exception error is

我给你一个一般的建议:

切勿以这种方式将 String 变量与 String 文字进行比较:

if (myStringWhichCanBeNull.equals("my literal which is never null")) // ...

总是这样:

if ("my literal which is never null".equals(myStringWhichCanBeNull)) // ...

在许多情况下,您将避免 NPE 并拥有更健壮的代码!

(我并不是说在这种情况下这救了你的命……)

于 2013-11-13T22:01:43.280 回答
1
line = this.reader.readLine();

while (!(line.equals(""))) {

您正在阅读一行,然后在调用它之前不要检查它是否为空equals()。如果文件中没有任何内容可读取,则它将为 null,如方法的 javadoc 中所述readLine()

于 2013-11-13T22:02:45.170 回答
0
 line = this.reader.readLine();

可能在第 13 行返回 null (对某些人来说很不幸)

然后你调用 .equals 就可以了

所以也许添加更多的错误检查

于 2013-11-13T22:06:59.013 回答
0

您需要在BufferedReader.readLine()调用该方法的任何地方检查 for null 的结果。正如 Java API 文档所述,BufferedReader.readLine()返回:

包含行内容的字符串,不包括任何行终止字符,如果已到达流的末尾,则为 null

您的外部循环检查空值,但您有额外的嵌套循环执行额外的读取但不检查空值。考虑重组代码并修改逻辑,以便只使用一个循环而不是嵌套多个循环来执行 readLine() 操作。否则,您将需要添加更多空检查并添加中断语句或修改循环条件,这可能会使代码更难阅读。

于 2013-11-13T22:07:38.353 回答