在Java中,为什么在尝试显示FileNotFoundException时会出现NullPointerException?

时间:2012-12-03 02:08:26

标签: java nullpointerexception try-catch

我认为只是显示代码和输出比试图解释它更容易:)

这是我的主要方法:

//prompt user for filename
    System.out.println("Please enter the text file name. (Example: file.txt):");
    String filename = ""; //will be used to hold filename

   //loop until user enters valid file name
    valid = false;
    while(!valid)
    {
        filename = in.next();
        try
        {
            reader.checkIfValid(filename);
            valid = true; //file exists and contains text
        }
        catch (Exception e)
        {
            System.out.println(e + "\nPlease try again.");
        }
    }

这是reader.checkIfValid方法:

public void checkIfValid(String filename) throws InvalidFileException, FileNotFoundException
{
    try
    {
        in = new Scanner(new File(filename));

        if (!in.hasNextLine()) // can't read first line
            throw new InvalidFileException("File contains no readable text.");
    }
    finally
    {
        in.close();
    }
}

这是输入不存在的文件时得到的输出:

请输入文本文件名。 (例如:file.txt):

doesNotExist.txt

显示java.lang.NullPointerException

请再试一次。

为什么System.out.println(e)会出现NullPointerException?当我输入一个空文件或带有文本的文件时,它工作得很好。空文件打印InvalidFileException(自定义异常)消息。

当我在“in = new Scanner(new File(filename));”周围放置一个try-catch语句,并让catch块显示异常时,我得到FileNotFoundException打印out,后面跟着 NullPointerException(我不完全确定为什么如果在checkIfValid方法中已经捕获了异常,那么main方法中的catch块会被激活...)。

我花了一段时间在这上面,我完全不知道什么是错的。任何帮助,将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:3)

编辑:我认为空指针来自对读者的调用,捕捉所有异常是不好的做法,因为你不再知道它们来自哪里!

也许checkIfValid方法应该检查文件名是否有效?

public boolean checkIfValid(String filename) {
    try {
        File file = new File(filename);
        return file.exists();   
    } catch (FileNotFoundException) {
        System.out.println("Invalid filename ["+filename+"] "+e);
    }
}

然后调用它的代码看起来像;

filename = in.next();
valid = reader.checkIfValid(filename);
if (valid)
    List<String> fileContents = readFromFile(filename);

然后在其自己的方法中包含所有文件读取逻辑;

public List<String> readFromFile(filename) {
    List<String> fileContents = new ArrayList<String>();
    try {
        in = new Scanner(new File(filename));
        while (in.hasNextLine()) {
            fileContents.add(in.nextLine);
        }
    } catch (IOException e){
        //do something with the exception
    } finally {
        in.close();
    }
    return fileContents;        
}

答案 1 :(得分:-1)

我的错误只是我能看到的。我抓住了所有的例外,所以我无法看到它的来源。谢谢你的帮助!