簡體   English   中英

Findbugs錯誤-錯誤:br為null保證在異常路徑上被取消引用

[英]Findbugs error - Bug: br is null guaranteed to be dereferenced on exception path

我需要閱讀屬性文件。 我為此使用BufferedReader和FileReader。 我在try部分之前將BufferedReader初始化為null,然后在try部分中進行初始化。 最后,我要關閉讀者。 此時,我得到標題中提到的錯誤。

完整的代碼如下

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初始化為非null,然后在try塊中將其初始化(這無法工作,因為無法在finally塊中解析變量:)。 在一些類似的帖子中,人們提到這可能是假陰性。 我還參考了-http://findbugs.sourceforge.net/bugDescriptions.html#NP_GUARANTEED_DEREF ,但無法弄清楚如何擺脫該錯誤。

如何擺脫這個錯誤?

問題是,如果BufferedReaderFileReader構造函數引發異常,則br將為null,但您仍無條件調用br.close() 在finally塊中將其關閉之前,請檢查br是否為空:

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-with-resources語句:

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

請注意,當前您的catch塊正在轉儲錯誤,然后繼續進行,就好像什么都沒發生一樣-而我希望將異常傳播給調用者。 如果無法讀取文件,您怎么辦? (通過我建議的第二和第三次更改,您仍然會吞下實際讀取的異常,但不會打開文件。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM