Android BufferedReader实例最终尝试关闭时无法解析

时间:2012-07-06 09:16:05

标签: java android

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

[...]
    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说“输入无法解析”。

我认为这可能是一个范围问题,但是我看到了来自其他人的代码,它通常有相同的形式,所以我不知道为什么它不能在这里工作。

任何提示?

提前多多感谢,

3 个答案:

答案 0 :(得分:2)

确实是范围错误 您的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();
            }
        }
    }
[...]

答案 1 :(得分:1)

全局声明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();
    }
[...]

答案 2 :(得分:1)

你是对的,这是一个范围问题。 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
        }
    }
}