【问题标题】:Java Scoping & Visibility RulesJava 范围和可见性规则
【发布时间】:2016-08-24 08:41:59
【问题描述】:

在很长一段时间后,我重新开始用 Java 编写代码 - 过去几年我的大部分编码工作都是在 PHP 和 JavaScript 中完成的 - 我发现我必须更加努力才能满足 Java 编译器的要求,这是对变量范围和异常处理等问题更加严格。一段给我带来麻烦的代码如下所示

File file = new File(path, fname);
FileOutputStream stream = null;
try 
{
 stream = new FileOutputStream(file);
 stream.write(tosave.getBytes());
}
finally 
{
 try
 {
  if (null != stream) {stream.close();}
  return true;
 }
 catch(Exception e){return false;}        
}

这被编译器接受。然而,在我来到这里之前,我遇到了几个问题。

  • 第一次尝试:没有 Catch Block。编译器拒绝玩球,因为它希望我处理无法创建 FileOutputStream 的可能性。同上写入该流。我理解这种推理背后的逻辑并喜欢它。
  • 第二次尝试:Catch Block 但是...:我在 try 块内声明并创建了 stream 变量。编译器再次出现问题 - stream 变量超出了 finally 块的范围。

如您所见,我通过在 try 块上方声明 stream 并将其初始化为 null 来解决此问题。

这行得通。然而,考虑到我的 Java 技能有多生疏,我想我会问:有没有正确的方法来编写这样的代码?

【问题讨论】:

标签: java exception-handling scope visibility


【解决方案1】:

在现代 Java 版本(自 Java 7 起)中处理此类场景的惯用方法是使用 try-with-resource 块来处理所有丑陋的关闭“逻辑”。您仍然必须捕获异常或将其向上传播,但这是一个相对较小的问题。考虑以下几点:

public static boolean writeToFile(String path, String fname) {
    File file = new File(path, fname);
    try (FileOutputStream stream = new FileOutputStream(file)) {
        stream.write(tosave.getBytes());
    } catch (IOException e) {
        // Should probably log the exception too
        return false;
    }
    return true;
}

【讨论】:

  • 感谢您提供的各种答案-我只能接受一个:-)。我不知道 try-with-resource 块。我想我最后一次做 Java 还是在版本 6--
【解决方案2】:

你可以简单地使用下面的代码 sn-p:

try (FileOutputStream stream = new FileOutputStream(file)){
    stream.write(tosave.getBytes());
}catch(IOException e) {
    e.printStackTrace();
    return false;
}

return true;

这是 Java 7 中引入的新功能 (try-with-resources Statement)。

【讨论】:

    【解决方案3】:

    “正确”的方法是使用 Java 7 的try with resources。已经有很长时间了,但它确实很好地清理了这种样板代码。

    如果您卡在较早的 Java 版本上,那就太倒霉了 :)

    【讨论】:

      【解决方案4】:

      我认为你会被不重要的东西挂断。是的,在某些情况下,编码 try/catch/finally 很重要,因为您实际上需要做一些事情来修复错误。

      但是对于打开/关闭文件,您不想为了满足编译器而陷入困境。代码可读性更为重要。

      怎么样:

      String path="somepath";
      String fname="somefile";
      String tosave="somedata";
      try {
          File file = new File(path, fname);
          FileOutputStream stream = new FileOutputStream(file);
          stream.write(tosave.getBytes());
          stream.close();
      }
      catch (Exception e) {
          e.printStackTrace();
          return false;
      }
      return true;
      

      【讨论】:

      • 我赞成您的回答,因为您的评论 - 代码可读性更重要 - 一个非常有效的观点。我应该提一下,这里的上下文是用于写入内部存储的 Android 的 Phonegap 插件。我怀疑设备拒绝创建/写入文件的可能性很大。
      猜你喜欢
      • 2022-10-24
      • 1970-01-01
      • 2018-09-22
      • 2023-03-21
      • 2014-04-05
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多