2012-07-06 62 views
0

我省略了代碼的不相關部分來解決無法解決「。的Android的BufferedReader實例不能在最後試圖關閉它

我認爲這可能是一個範圍問題,但我看過其他人的代碼,它通常具有相同的形式,所以我不知道它爲什麼不在這裏工作。

任何提示?

非常感謝提前,

+1

可能重複[問題與在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

回答

2

這的確是一個範圍錯誤。
您的inputtry區塊內聲明,因此在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(); 
      } 
     } 
    } 
[...] 
+0

非常感謝。有時在編碼過多之後,你會被破壞而看不到這些明顯的東西。我會盡快在stackoverflow讓我這樣做的時候選擇你的答案(它說我必須等待7分鐘) – 2012-07-06 09:25:04

+1

確保在你的'finally'塊中,在試圖關閉它之前檢查'input'是否爲'null'。如果您的網址格式不正確,則永遠不會分配「輸入」,但您仍然會嘗試關閉它。 – Hbcdev 2012-07-06 09:28:38

+0

@Hbcdev好點,更新了代碼。 Fran:不客氣。 – 2012-07-06 09:32:04

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(); 
    } 
[...] 
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 
     } 
    } 
}