【问题标题】:close, destructor and finalize: Java contradictions [duplicate]关闭、析构和终结:Java 矛盾 [重复]
【发布时间】:2014-06-25 09:28:52
【问题描述】:

我有以下代码,在我的课堂上可以很好地逐行读取文件。

 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 编程有点模糊和混乱?我的意思是,destructor 显然没有真正的使用,finalize 的使用是非常值得怀疑的,close 的使用也被建议为不必要的。关于这些问题的一些帖子是矛盾的和非结论性的。

那么,这里如何进行呢?在我真的需要关闭文件的情况下,如何摆脱这个错误信息?关闭文件真的可有可无吗?为程序完成清理类实例怎么样?

【问题讨论】:

  • 你在哪个地方打电话给in.close()?请记住,在 Java 中,范围很重要。
  • @PradeepSimha - 就在 catch 结束之后{}
  • 在 try 块之外声明 in
  • @Vash - 它不是重复的,因为你提到的帖子没有解决我在这里引用的问题,命令“关闭”也没有
  • Java 中没有析构函数。 finalize() 方法确实不是您应该使用或依赖的东西。并且 close() 是绝对需要调用的。使用try-with-resources 语句,了解变量作用域。这是一个在每种语言中都很重要的概念。

标签: java class file-io code-cleanup finalize


【解决方案1】:

你可能正在关闭 in.close() 外面的 try 块,所以很明显你会得到错误,因为 in 是在本地的 try 块中定义的。

最好使用try with resource,这样你就不需要手动关闭文件流

【讨论】:

  • 谢谢。使用“尝试资源”是一个好方法。
  • @EmmaYazzie 不客气
【解决方案2】:

理想情况下,您必须在null 检查之后调用finally 块内的close() 方法。 为此,您需要在 try 块之外声明变量 in

finally 块中调用close() 方法可确保无论try 块中的代码是否抛出异常,都会调用该方法。

编辑: 这是当您使用 Java 6 或更早版本时。对于 Java 7 及更高版本,您可以按照@JqueryLearner 的建议使用 try with resource

【讨论】:

  • try-with-resources 更好。做对更容易,做错更难,我认为可能还有其他优势。
  • 我的意思是 Java 6 或更早版本。编辑了我的答案。谢谢
【解决方案3】:

您收到错误是因为您在 try 块内定义了变量 in,因此在 catch/finally/或该 try 之外的任何地方都看不到它。将声明移到 try 之外:

改变这个

try {  FileInputStream in = new FileInputStream(filename);

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

【讨论】:

  • 不要使用 cmets 来争论网站的机制。
  • @JunedAhsan - 解决了错误消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 2018-12-26
  • 2013-02-02
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多