2

为 Java 作业作业编写了一个基本文件处理程序,当我收到作业时,我有一些关于未能捕获一些实例的注释:

  • 来自文件的缓冲区可能为空。
  • 找不到文件
  • 文件流未关闭

这是用于打开文件的代码块:

/**
 * 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的不够好。

4

4 回答 4

7
  • 来自文件的缓冲区可能为空。

该文件可能为空。也就是说,在打开文件时到达文件结尾。loadedString = buffRead.readLine()然后将返回null。

也许你应该通过添加类似的东西来解决这个问题if (loadedString == null) loadedString = "";

  • 找不到文件

正如它的构造函数文档中所解释的那样,FileInputStream(String)它可能会抛出一个FileNotFoundException. 您确实在您的IOException子句中抓住了这一点(因为FileNotFoundException 是 an IOException),所以这很好,但您也许可以这样做:

} catch (FileNotFoundException fnfe) {
    System.err.println("File not fonud!");
} catch (IOException ioex {
    System.err.println("Some other error");
}
  • 文件流未关闭

您确实调用fin.close()which 在正常情况下会关闭文件流。也许他的意思是它并不总是关闭的。readLine可能会抛出一个,IOException在这种情况下close()会跳过。这就是将它放在finally子句中的原因(确保无论try-block 中发生什么,它都会被调用。(*)


(*) 正如@mmyers 正确指出的那样,由于您调用了-block,因此将其close()放入finally块中实际上是不够的。如果这确实是所需的行为,您可以在 catch 子句中设置一个错误标志,如果设置了这个标志,则在 finally 子句之后退出。System.exit(-1)catch

于 2010-05-27T18:53:35.470 回答
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) {
    }
}
于 2010-05-27T18:52:51.440 回答
1

buffRead.readLine()抛出异常,你FileInputStream会被关闭,还是会跳过那一行?块的目的finally是即使在特殊情况下,finally块中的代码也会执行。

于 2010-05-27T18:50:31.377 回答
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
}
于 2010-05-27T18:59:14.283 回答