我无法打开文件。 hasNext
似乎因以下错误java.lang.NullPointer
而崩溃。这是我错误的代码(使用hasNext
)。
import java.io.*;
import java.util.Scanner;
public class Customers{
private Scanner opener;
public void openFile() {
try {
opener = new Scanner (new File ("customer.txt"));
} catch (Exception f) {
System.out.println("Can not read file.");
}
}
public void readFile() {
while(opener.hasNext()) {
String a = opener.next();
String b = opener.next();
String c = opener.next();
System.out.printf("%s %s %s\n", a, b, c);
}
}
public void closeFile() {
opener.close();
}
}
这是另一个类:
public class fileTest {
public static void main (String args []) {
Customers c = new Customers();
c.openFile();
c.readFile();
c.closeFile();
}
}
答案 0 :(得分:4)
开启者可能为null,因为打开文件时可能会出现异常
public void openFile() throws Exception{
opener = new Scanner (new File ("customer.txt"));
}
如果在打开文件时有任何异常,那么只打印一条消息,并且opener保持为null,这将导致opener.hasNext()中的NPE
您不应该捕获异常而是抛出异常,因为如果您无法打开该文件,那么代码应该失败并且其他方法不应该执行。
答案 1 :(得分:2)
您的问题不明确,但您似乎表示opener.hasNext()
正在抛出NPE。
如果是,则表示opener
为null
。这反过来意味着要么你不是在调用openFile()
,要么你正在调用它,但它不起作用。我怀疑后者,特别是因为main
方法确实调用了openFile()
。
如果openFile()
方法无法打开文件(例如,因为它不存在路径名所示),则会打印一条消息,opener
仍为null
。这可能就是发生的事情。
openFile()
方法存在许多缺陷:
Exception
...它可能会捕捉到除您期望之外的其他例外情况。 NPE问题是openFile()
缺陷的结果。
请注意,如果您打印出实际的异常消息,它应该告诉您应用程序无法打开文件的原因。
更新
错误消息customer.txt (The system cannot find the file specified)
清楚地告诉您它无法找到该文件。可能是您的应用程序的当前目录不是包含该文件的目录。由于您使用了相对路径名,因此您告诉它它在当前目录中。解决方案是使用绝对(完整)路径名...或确保使用正确的当前目录启动应用程序。
一旦解决了这个问题,您在阅读文件的方式就会出现问题。 readFile()
方法假设它能够从输入中读取3个标记(字符串)的倍数。如果文件格式有问题,您可能会收到(未经检查的)异常。您可能应该捕获此异常并生成诊断...而不是假设不会发生任何不良事件。
答案 2 :(得分:0)
首先:确保您的文件确实存在于磁盘中,即使文件不存在,也可以创建File
对象。
第二:您正在通过doin opener.hasNext()
签入一个元素并访问接下来的3个元素!
如果列表opener.hasNext()
中只有一个元素返回true
,但您正在访问下一个不存在的2个元素!因此空指针异常
答案 3 :(得分:0)
你的opener
没有初始化为什么空指针异常,确保文件存在,只是尝试给出文件的绝对路径
答案 4 :(得分:0)
在这里查看几点:
2.你的代码的第二个问题是你只检查一次while(opener.hasNext())for next element然后读取三个元素String a = opener.next(); String b = opener.next(); String c = opener.next(); 。如果文件中没有下一个元素,您将获得异常,在访问之前检查每个元素。
请改用此代码:
public void readFile(){ while(opener.hasNext()){ String a = opener.next(); System.out.printf(“%s \ n”,a); } }