hasNext Java代码

时间:2012-12-20 05:49:38

标签: java

我无法打开文件。 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();
}

}

5 个答案:

答案 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。

如果是,则表示openernull。这反过来意味着要么你不是在调用openFile(),要么你正在调用它,但它不起作用。我怀疑后者,特别是因为main方法确实调用了openFile()

如果openFile()方法无法打开文件(例如,因为它不存在路径名所示),则会打印一条消息,opener仍为null。这可能就是发生的事情。


openFile()方法存在许多缺陷:

  1. 它正在捕捉Exception ...它可能会捕捉到除您期望之外的其他例外情况。
  2. 它没有记录堆栈跟踪或实际的异常消息
  3. 假设该问题是由于无法打开文件...当它可能是其他东西时(通常,如果不是在这种特殊情况下),
  4. 一旦打印出错误消息,它就会继续,好像什么都没发生一样
  5. 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)

在这里查看几点:

  1. 您的程序是否正在读取指定的文件?如果您正在使用eclipse,请将您的文件保存在src文件夹中并将路径作为opener = new Scanner(新文件(“src / customer.txt”));
  2. 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);         }     }