繁体   English   中英

在 Java 中,为什么我在尝试显示 FileNotFoundException 时会收到 NullPointerException?

[英]In Java, why am I getting a NullPointerException when trying to display a FileNotFoundException?

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

这是来自我的主要方法:

//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):

不存在.txt

java.lang.NullPointerException

请再试一次。

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

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

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

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

也许 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;        
}

我的错误只有我才能看到。 我正在捕获所有异常,所以我无法看到它来自哪里。 感谢您的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM