我需要读取属性文件。我正在使用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,但无法弄清楚如何摆脱这个错误。
答案 0 :(得分:8)
如何摆脱这个错误?
问题是如果BufferedReader
或FileReader
构造函数抛出异常,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
块正在转储错误,但之后仍然没有发生任何事情 - 而我期望将异常传播给调用者。如果无法读取文件,您想要会发生什么? (根据我建议的第二次和第三次更改,您仍然会吞下实际阅读的异常,但不会打开文件。)