【问题标题】:Android BufferedReader instance cannot be resolved at finally trying to close it [duplicate]Android BufferedReader 实例在最终尝试关闭时无法解决[重复]
【发布时间】:2012-07-06 09:16:04
【问题描述】:

我省略了代码中不相关的部分:

[...]
    try {
        URL url = new URL(updateUrl);
        BufferedReader input = new BufferedReader(new InputStreamReader(url.openStream()));
[...]
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
    } finally {
        input.close();
    }
[...]

问题是在最后的“input.close()”上,Eclipse 说“输入无法解析”。

我认为这可能是一个范围问题,但我看过其他人的代码,而且它通常具有相同的形式,所以我不知道为什么它在这里不起作用。

有什么提示吗?

非常感谢,

【问题讨论】:

    标签: java android


    【解决方案1】:

    确实是范围错误。
    您的 input 在 try 块内声明,因此在 finally 块内看不到它。在外面声明它,这样它对双方都可见,你应该没问题:

    [...]
        BufferedReader input = null;
        try {
            URL url = new URL(updateUrl);
            input = new BufferedReader(new InputStreamReader(url.openStream()));
    [...]
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
        } finally {
            if (input != null)
            {
                try {
                  input.close();
                }
                catch (IOException exc)
                {
                  exc.printStackTrace();
                }
            }
        }
    [...]
    

    【讨论】:

    • 非常感谢。有时,在编码过多之后,您会变得如此迷惑,以至于看不到这些明显的东西。一旦stackoverflow让我这样做,我就会选择你的答案(它说我必须等待七分钟)
    • 确保在您的finally 块中检查input 是否为null,然后再尝试关闭它。如果您的 URL 格式不正确,input 将永远不会被分配到,但您仍会尝试对其调用 close。
    • @Hbcdev 好点,更新了代码。弗兰:不客气。
    • Erm... 现在我不知道谁是第一个给出正确答案的人。我想是你,因为我第一次看到这些答案是你的第一个......
    【解决方案2】:

    将BufferedReader 输入实例全局或在第一个try/catch块之外声明为:

    [...]
    BufferedReader input;
        try {
            URL url = new URL(updateUrl);
            input = new BufferedReader(new InputStreamReader(url.openStream()));
    [...]
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
        } finally {
            input.close();
        }
    [...]
    

    【讨论】:

      【解决方案3】:

      你是对的,这是一个范围问题。 Java 使用块作用域,这意味着在一个作用域中声明的局部变量在任何不包含在其中的作用域中都是不可见的。 try 块和 finally 块也不例外。

      BufferedReader input;
      try {
          URL url = new URL(updateUrl);
          input = new BufferedReader(new InputStreamReader(url.openStream()));
      } catch (MalformedURLException e) {
          e.printStackTrace();
      } catch (IOException e) {
      } finally {
          if (input != null) {
              try {
                  input.close();
              } catch (IOException e) {
                  // Log or ignore this
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-11
        • 1970-01-01
        • 2015-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-15
        相关资源
        最近更新 更多