我省略了代碼的不相關部分來解決無法解決「。的Android的BufferedReader實例不能在最後試圖關閉它
我認爲這可能是一個範圍問題,但我看過其他人的代碼,它通常具有相同的形式,所以我不知道它爲什麼不在這裏工作。
任何提示?
非常感謝提前,
我省略了代碼的不相關部分來解決無法解決「。的Android的BufferedReader實例不能在最後試圖關閉它
我認爲這可能是一個範圍問題,但我看過其他人的代碼,它通常具有相同的形式,所以我不知道它爲什麼不在這裏工作。
任何提示?
非常感謝提前,
這的確是一個範圍錯誤。
您的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讓我這樣做的時候選擇你的答案(它說我必須等待7分鐘) – 2012-07-06 09:25:04
確保在你的'finally'塊中,在試圖關閉它之前檢查'input'是否爲'null'。如果您的網址格式不正確,則永遠不會分配「輸入」,但您仍然會嘗試關閉它。 – Hbcdev 2012-07-06 09:28:38
@Hbcdev好點,更新了代碼。 Fran:不客氣。 – 2012-07-06 09:32:04
聲明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();
}
[...]
你說得對,這是一個範圍問題。 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
}
}
}
可能重複[問題與在Java中的try catch塊變量「範圍」(http://stackoverflow.com/questions/2854144/problem-with-scopes-of-variables-in-try -catch-blocks-in-java) – 2012-07-06 09:31:58