Findbugs错误 - 错误:br为null保证在异常路径上取消引用

时间:2013-12-10 07:08:35

标签: java eclipse findbugs

我需要读取属性文件。我正在使用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,但无法弄清楚如何摆脱这个错误。

1 个答案:

答案 0 :(得分:8)

  

如何摆脱这个错误?

问题是如果BufferedReaderFileReader构造函数抛出异常,br将为null,但您仍然无条件地调用br.close()。在finally块中关闭它之前检查br是否为空:

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

或者,在<{em> 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块正在转储错误,但之后仍然没有发生任何事情 - 而我期望将异常传播给调用者。如果无法读取文件,您想要会发生什么? (根据我建议的第二次和第三次更改,您仍然会吞下实际阅读的异常,但不会打开文件。)