我已经创建了一个主类来运行它,但是它在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()
中包含此类的对象以及从该对象调用方法。
答案 0 :(得分:2)
问题是x
为空。
根据您显示的代码,这只能是因为openFile()
中引发了异常,而您忽略了它。
让openFile
抛出异常:
public void openFile() throws IOException {
x = new Scanner(new File("testfile.txt"));
}
(您还需要将throws IOException
添加到主方法中)
现在抛出IOException
的事实将阻止您的代码执行,因此它不会尝试读取该文件。
假设您没有设置默认异常处理程序,您还将获得异常的堆栈跟踪,其中将包含抛出异常的原因的详细信息。
作为关于异常处理的一般原则,不要捕获Exception
,除非这确实是您真正需要处理的异常。它捕获所有异常,并可能意外地捕获某些真正应该单独处理的异常类型。
除非你确实确定这是正确的做法,否则你也不应该只是吞下例外。您应该对异常做的最低限度是在catch
:
e.printStackTrace();
然而,这不是当前情境中的最佳选择,因为您实际上需要在调用方法中停止进一步执行:传播异常是更好的选择。