我认为只是显示代码和输出比试图解释它更容易:)
这是我的主要方法:
//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块会被激活...)。
我花了一段时间在这上面,我完全不知道什么是错的。任何帮助,将不胜感激。谢谢!
答案 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)
我的错误只是我能看到的。我抓住了所有的例外,所以我无法看到它的来源。谢谢你的帮助!