为Java Homework任务编写了一个基本文件处理程序,当我收到作业后,我有一些关于未能捕获一些实例的注释:
以下是用于打开文件的代码块:
/**
* Create a Filestream, Buffer, and a String to store the Buffer.
*/
FileInputStream fin = null;
BufferedReader buffRead = null;
String loadedString = null;
/** Try to open the file from user input */
try
{
fin = new FileInputStream(programPath + fileToParse);
buffRead = new BufferedReader(new InputStreamReader(fin));
loadedString = buffRead.readLine();
fin.close();
}
/** Catch the error if we can't open the file */
catch(IOException e)
{
System.err.println("CRITICAL: Unable to open text file!");
System.err.println("Exiting!");
System.exit(-1);
}
我从他那里得到的一个评论是fin.close();
需要在finally
块中,我根本没有。但我认为我创建try / catch的方式可以避免文件无法打开的问题。
让我明白一些事情:这不适用于当前的任务(不是试图让某人做我自己的工作),我已经创建了我的项目并且已经对它进行了评分。我自己并不完全理解教授的推理。最后,我没有很多Java经验,所以我有点困惑为什么我的catch
不够好。
答案 0 :(得分:7)
- 来自文件的缓冲区可能为空。
该文件可能为空。也就是说,打开文件时会到达文件结尾。然后loadedString = buffRead.readLine()
将返回null。
也许您应该通过添加if (loadedString == null) loadedString = "";
- 找不到文件
正如FileInputStream(String)
的构造函数的文档中所解释的那样,它可能会抛出FileNotFoundException
。您确实在IOException
子句中发现了这一点(因为FileNotFoundException
是 IOException
),所以没关系,但您可能已经做过:
} catch (FileNotFoundException fnfe) {
System.err.println("File not fonud!");
} catch (IOException ioex {
System.err.println("Some other error");
}
- 文件流未关闭
您可以调用fin.close()
,这在正常情况下会关闭文件流。也许他意味着总是关闭。 readLine
可能会抛出IOException
,在这种情况下会跳过close()
。这就是将它放在finally
子句中的原因(无论try
- 块中发生什么,都可以确保它被调用。(*)
(*)正如@mmyers正确指出的那样,将close()
置于finally
块中实际上是不够的,因为您在System.exit(-1)
- 块中调用了catch
。如果这确实是所需的行为,您可以在catch子句中设置错误标志,如果设置了此标志,则在finally子句之后退出。
答案 1 :(得分:3)
但是如果你的程序在try
块的第二行或第三行引发异常怎么办?
buffRead = new BufferedReader(new InputStreamReader(fin));
loadedString = buffRead.readLine();
此时,已打开文件句柄并将其分配给fin
。您可以捕获异常,但文件句柄将保持打开状态。
您需要将fin.close()
语句移至finally
块:
} finally {
try {
if (fin != null) {
fin.close();
}
} catch (IOException e2) {
}
}
答案 2 :(得分:1)
说buffRead.readLine()
会抛出异常,您的FileInputStream
会被关闭,还是会跳过该行? finally
块的目的是即使在异常情况下,finally
块中的代码也会执行。
答案 3 :(得分:0)
除了打开文件之外,还有许多其他错误可能发生。
最后,您可能会得到一个已定义或未定义的fin,您必须防止空指针错误,并且不要忘记关闭文件可能会抛出新的异常。
我的建议是在一个单独的例程中捕获它,让IOExceptions飞出它:
类似
private String readFile() throws IOException {
String s;
try {
fin = new FileInputStream(programPath + fileToParse);
buffRead = new BufferedReader(new InputStreamReader(fin));
s = buffRead.readLine();
fin.close();
} finally {
if (fin != null {
fin.close()
}
}
return s
}
然后你需要的地方:
try {
loadedString = readFile();
} catch (IOException e) {
// handle issue gracefully
}