从Java中读取文件会抛出一个`NullPointerException`

时间:2016-06-05 22:22:31

标签: java nullpointerexception java-io

我已经创建了一个主类来运行它,但是它在NullPointerException方法中抛出了一个NPE readFile()。我不确定为什么会这样。

/* this code is to read from a file testfile.txt which is already made beforehand with data in it*/
import java.io.*; //imported files
import java.util.*;

public class file_read {
  private Scanner x; //for reading from file

  public void openFile() {
    try {
      x = new Scanner(new File("testfile.txt"));
    } catch (Exception e) {
      System.out.println("error occurred");
    }
  }

  public void readFile() { //error in this method(NPE)
    while (x.hasNext()) {
      String a = x.next();
      String b = x.next();
      String c = x.next();
      System.out.printf("%s %s %s \n", a, b, c);
    }
  }

  public void closeFile() {
    x.close();
  }
}

public class file_read_main {
  public static void main(String[] args) {
    file_read obj = new file_read();
    obj.openFile();
    obj.readFile();
    obj.closeFile();
  }
}

这是一堂课。另一个类已经使main()中包含此类的对象以及从该对象调用方法。

1 个答案:

答案 0 :(得分:2)

问题是x为空。

根据您显示的代码,这只能是因为openFile()中引发了异常,而您忽略了它。

openFile抛出异常:

public void openFile() throws IOException {
  x = new Scanner(new File("testfile.txt"));
}

(您还需要将throws IOException添加到主方法中)

现在抛出IOException的事实将阻止您的代码执行,因此它不会尝试读取该文件。

假设您没有设置默认异常处理程序,您还将获得异常的堆栈跟踪,其中将包含抛出异常的原因的详细信息。

作为关于异常处理的一般原则,不要捕获Exception,除非这确实是您真正需要处理的异常。它捕获所有异常,并可能意外地捕获某些真正应该单独处理的异常类型。

除非你确实确定这是正确的做法,否则你也不应该只是吞下例外。您应该对异常做的最低限度是在catch

中打印其堆栈跟踪
e.printStackTrace();

然而,这不是当前情境中的最佳选择,因为您实际上需要在调用方法中停止进一步执行:传播异常是更好的选择。