2013-12-10 22 views
0

我需要讀取屬性文件。我爲此使用了BufferedReader和FileReader。我在嘗試部分初始化BufferedReader並在try部分初始化之前將其初始化爲null。最後,我正在關閉讀者。在這一點上,我收到了標題中提到的錯誤。Findbugs錯誤 - 錯誤:br保證在異常路徑上取消引用

完整的代碼如下

public void getPageTitleProperties() throws IOException 
    { 

     BufferedReader br = null; 
     String lhs, rhs; 
     try 
     { 
      br = new BufferedReader(new FileReader("res" + File.separator + "pagetitle.properties")); 
      String line; 
      while ((line = br.readLine()) != null) 
      { 
       String [] keyvalue = line.split("="); 
       lhs = keyvalue[0]; 
       rhs = keyvalue[1]; 
       expectedTitles.put(lhs, rhs); 
      } 
     } 
     catch (RuntimeException ex) 
     { 
      ex.printStackTrace(); 
     } 
     catch (IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
     finally 
     { 
      br.close(); 
     } 

     System.out.println("Expected URLs and Titles"); 
     for (String url : expectedTitles.keySet()) 
     { 
      System.out.println(url + ":" + expectedTitles.get(url)); 
     } 

    } 

的錯誤細節 -

我怎樣才能擺脫這種錯誤的?我嘗試初始化非空的BR,在try塊中初始化它(這不起作用,因爲變量不能在finally塊中解析:))。在一些類似的帖子中,人們已經提到這可能是錯誤的否定。我也參考了 - http://findbugs.sourceforge.net/bugDescriptions.html#NP_GUARANTEED_DEREF,但不知道如何擺脫這個錯誤。

回答

8

我該如何擺脫這個錯誤?

的問題是,如果BufferedReaderFileReader構造函數拋出異常,br將是空的,但你還是無條件調用br.close()。檢查br是否爲空,你在finally塊關閉它之前:

finally { 
    if (br != null) { 
     br.close(); 
    } 
} 

另外,之前爲它分配try塊:

BufferedReader br = new BufferedReader(...); 
try { 
    ... 
} catch (...) { 
    ... 
} finally { 
    br.close(); // br will definitely not be null 
} 

甚至更​​好在Java 7中,使用試戴與資源聲明:

try (BufferedReader br = new BufferedReader(...)) { 
    ... 
} catch (...) { 
    ... 
} 

注意,目前您的catch塊傾倒錯誤,但隨後繼續,好像什麼也沒有發生 - 而我會期望異常傳播給調用者。 想要如果文件不能被讀取發生什麼? (隨着我建議的第二次和第三次更改,你仍然會吞下實際閱讀的例外,但不打開文件。)

+0

當Jon Skeet發佈了答案時,沒有人敢發佈新答案 – Baby

+0

對不起。但是沒有任何一種建議的方法會讓這個bug出錯,並且仍然會給出相同的錯誤。如果我有JDK 7.0,那有什麼區別嗎? – Sumod

+0

@Sumod:所有這些答案*真的*應該解決這個問題。最後一種方法(試用資源)是最乾淨的,所以我建議你把重點放在那個方面。用一個新的部分來編輯你的問題,顯示你的代碼,以及你得到的確切錯誤(用你正在顯示的確切代碼,而不是其他包含你未顯示的代碼的代碼)。 –