关闭、析构函数和finalize:Java中的矛盾

3
我有以下代码,在我的类中逐行读取文件时运行良好。
 try {  FileInputStream in = new FileInputStream(filename);
        BufferedReader reader=new BufferedReader(new InputStreamReader(in));
        String line;
        while((line=reader.readLine())!=null){
             // read the file
        }
    }
    catch (Exception e) {
        System.out.println(e);
    }

但是,如果我尝试添加命令close,在文件读取完成后执行,那么就会出现错误:
    in.close();

Error:(131, 9) java: cannot find symbol
symbol:   variable in
location: class ReadFile

我搜索了有关在使用后清洁对象以及在程序结束之前关闭文件的需求,并在Java上发现了许多帖子,但其中许多是非常矛盾的。问题是最终我感到很困惑。

我错了吗?或者说Java编程有点模糊和混乱吗?我的意思是,显然没有真正使用析构函数,使用finalize也是非常值得怀疑的,close的使用也被认为是不必要的。关于这些问题的一些帖子是相互矛盾且不确定的。

那么,如何处理呢?如果我确实需要关闭文件,该如何摆脱这个错误消息?关闭文件是否真的可以免去不必要的操作?在程序完成时清理类实例又如何?


2
你在哪个位置调用了 in.close()?记住在Java中,作用域很重要。 - Pradeep Simha
2
Java中没有析构函数。finalize()方法确实不是您应该使用或依赖的内容。而close()方法绝对需要调用。请使用try-with-resources语句,并了解变量作用域。这个概念在任何语言中都很重要。 - JB Nizet
@PradeepSimha - 如果我按照你的建议去做,它只会给出另一个错误。 - Emma Yazzie
如果您有JDK 7,您可以使用“try-with-resources”语句,而不是编写丑陋的try-catch-finally。 - Siyuan Ren
@JBNizet,不是每种语言...据我所知,PostScript没有范围(scope),但您可以模拟它,我也不认为TeX有。 - dfeuer
显示剩余6条评论
3个回答

5

您可能在try块外关闭in.close(),显然会出现错误,因为in定义在try块中,是一个局部变量。

最好使用try-with-resources,这样您就不需要手动关闭文件流了。


使用“try with resource”是一个很好的方法。谢谢。 - Emma Yazzie
@EmmaYazzie 欢迎您 - SpringLearner

5
你之所以出现错误,是因为你在try块内定义了变量in,所以它在catch/finally或try外部任何地方都不可见。将声明移到try之外:

改成这样

try {  FileInputStream in = new FileInputStream(filename);

to

FileInputStream in = null;
try {  in = new FileInputStream(filename);

请勿在评论中讨论网站的机制。 - Flexo
@JunedAhsan - 这解决了错误信息。 - Emma Yazzie

1
理想情况下,您必须在 finally 块中调用 close() 方法,在 null 检查之后。为此,您需要在 try 块外声明变量 in
finally 块中调用 close() 方法可确保无论 try 块中的代码是否抛出异常,都会调用该方法。 编辑: 这适用于使用 Java 6 或更早版本的情况。对于 Java 7 及更高版本,您可以使用 @JqueryLearner 建议的 try with resource

1
使用try-with-resources更好。它更容易正确使用,更难出错,我认为还有其他优点。 - dfeuer
我指的是Java 6或更早版本。已编辑我的答案。谢谢。 - Kuldeep Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接