0

我在打开文件时遇到问题。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();
}

}

4

5 回答 5

4

opener 可能为 null,因为打开文件时可能出现异常

public void openFile() throws Exception{

            opener = new Scanner (new File ("customer.txt"));
    }

如果打开文件有任何异常,则只打印一条消息,并且 opener 保持为空,这将导致 opener.hasNext() 中的 NPE

您不应该捕获异常而是抛出异常,因为如果您无法打开文件,那么代码应该会失败并且其他方法不应该执行。

于 2012-12-20T05:52:18.187 回答
2

您的问题不清楚,但您似乎是在说这opener.hasNext()是在抛出 NPE。

如果是这样,那就意味着openernull。这反过来意味着要么你没有打电话,要么你openFile()正在打电话但它不起作用。我怀疑后者,特别是因为该main方法确实调用了openFile().

如果该openFile()方法无法打开文件(例如,因为它不存在给定的路径名​​),则打印一条消息并opener保留null。这可能就是正在发生的事情。


openFile()方法有许多缺陷:

  1. 它正在捕获Exception……它可能会捕获除您期望的异常之外的其他异常。
  2. 它没有记录堆栈跟踪或实际的异常消息
  3. 假设问题是由于无法打开文件......当它可能是其他东西时(通常,如果不是在这种特殊情况下),
  4. 一旦它打印了错误消息,它就会继续,就好像没有发生任何不好的事情一样

NPE 问题是openFile()缺陷的结果。

请注意,如果您打印出实际的异常消息,它应该会告诉您应用程序无法打开文件的原因。

更新

错误消息customer.txt (The system cannot find the file specified)清楚地告诉您它找不到文件。您的应用程序的当前目录可能不是包含该文件的目录。由于您使用了相对路径名,因此您告诉它在当前目录中查找。解决方案是使用绝对(完整)路径名......或确保使用正确的当前目录启动您的应用程序。


一旦你解决了这个问题,你读取文件的方式就会出现问题。该readFile()方法假设它将能够从输入中读取 3 个标记(字符串)的倍数。如果文件格式有问题,您可能会遇到(未经检查的)异常。您可能应该捕获此异常并生成诊断信息……而不是假设不会发生任何不好的事情。

于 2012-12-20T05:57:01.647 回答
0

File第一:确保你的文件确实存在于磁盘中,即使文件不存在也可以创建对象。

第二:您正在通过 doin 签入一个元素opener.hasNext()并访问接下来的 3 个元素!

当列表中只有一个元素时opener.hasNext()返回true,但您正在访问接下来的 2 个不存在的元素!因此空指针异常

于 2012-12-20T05:53:21.627 回答
0

opener没有被初始化为什么空指针异常,确保文件存在在那里,只是尝试给出文件的绝对路径

于 2012-12-20T06:02:01.740 回答
0

在这里检查几点:

  1. 您的程序是否正在读取指定的文件?如果您使用的是 eclipse,请将您的文件保存在 src 文件夹中,并将路径指定为 opener = new Scanner (new File ("src/customer.txt"));

2.您的代码的第二个问题是您只检查一次 while(opener.hasNext()) 的下一个元素,然后读取三个元素 String a = opener.next(); 字符串 b = opener.next(); 字符串 c = opener.next(); .如果文件中没有下一个元素,您将收到异常,请在访问之前检查每个元素。

请改用此代码:

public void readFile() { while(opener.hasNext()) { String a = opener.next(); System.out.printf("%s\n", a); } }

于 2012-12-20T06:06:45.570 回答