当前位置: 首页 > 面试题库 >

在Java中捕获IOException后如何关闭文件?

陶宏浚
2023-03-14
问题内容

所有,

我试图确保在捕获IOException时关闭我用BufferedReader打开的文件,但它看起来好像我的BufferedReader对象超出了catch块的范围。

public static ArrayList readFiletoArrayList(String fileName, ArrayList fileArrayList)
{
    fileArrayList.removeAll(fileArrayList);

    try {
        //open the file for reading
        BufferedReader fileIn = new BufferedReader(new FileReader(fileName));

        // add line by line to array list, until end of file is reached
        // when buffered reader returns null (todo). 
        while(true){
                fileArrayList.add(fileIn.readLine());
            }
    }catch(IOException e){
        fileArrayList.removeAll(fileArrayList);
        fileIn.close(); 
        return fileArrayList; //returned empty. Dealt with in calling code. 
    }
}

Netbeans抱怨说它在catch块中“找不到符号fileIn”,但是我想确保在发生IOException的情况下,Reader被关闭。在没有围绕第一个try
/ catch构造的丑陋的情况下,我该怎么做呢?

在这种情况下,有关最佳做法的任何提示或建议,


问题答案:
 BufferedReader fileIn = null;
 try {
       fileIn = new BufferedReader(new FileReader(filename));
       //etc.
 } catch(IOException e) {
      fileArrayList.removeall(fileArrayList);
 } finally {
     try {
       if (fileIn != null) fileIn.close();
     } catch (IOException io) {
        //log exception here
     }
 }
 return fileArrayList;

关于上述代码的几件事:

  • close应该在final中,否则在代码正常完成时,或者在IOException之外引发其他异常时,它不会关闭。
  • 通常,您有一个静态实用程序方法来关闭类似的资源,以便它检查null并捕获任何异常(除了在此上下文中登录外,您永远不想做任何其他事情)。
  • 返回属于尝试之后的内容,因此主代码和异常捕获都具有没有冗余的return方法。
  • 如果将返回值放在finally中,则会生成编译器警告。


 类似资料:
  • 我想寻求帮助,了解如何在JUnit测试中捕获IOException,以测试我的代码在发生错误时是否会抛出正确的异常。 以下是我的主要代码: 这是我的JUnit: 我想我必须在JUnit测试中创建一个错误的路径来抛出该异常,但我没能得到我想要的结果。我很感谢你的帮助。谢谢

  • 问题内容: 不久前,我正在寻找Java中的可嵌入的分布式版本控制系统,我想我已经在JGit中找到了它,它是git的纯Java实现。但是,示例代码或教程的方式并不多。 如何使用JGit检索某个文件的HEAD版本(就像或应该做)? 我想这涉及一些rev-tree-walking,并且正在寻找代码示例。 问题答案: 不幸的是,Thilo的答案不适用于最新的JGit API。这是我找到的解决方案: 我希望

  • ASPX。NET应用程序,使用XDocument。Load()从XML文件中读取。有时它会抛出IOException static,说明文件无法打开,因为它正被另一个进程使用。我无法通过打开文件并重新加载网站来随意重新创建它。但更奇怪的是,异常发生在Try-Catch块中,我在其中显式捕获系统。IOException。 这是堆栈: 异常类型:IOException 线程信息:线程ID:18线程帐户

  • 我在做一个项目。我用JAVA(.exec())抓取了PowerShell版本。 它显示,但我想打印唯一的版本,这是一个在底部。我怎么能那么做? 以下内容的代码块:

  • 我试图在下面的代码中覆盖catch块,但我无法。我知道在读/写文件时需要引起IOException,但我不能这样做。而且,我不能使用PowerMockito来覆盖静态方法,因为我使用的是JUnit5。有人能帮忙吗? 这是我编写的一个测试用例,但它返回了这个错误-org.mockito.exceptions.Misusing.MissingMethodInvocationException:when

  • 我试图得到关闭标记后的文本,但找不到任何好的解决方案我的html是这样的: 是的,记住它没有任何容器。 有什么解决办法吗?