Java 使用try with resources或关闭此";“BufferedReader”;在“a”中;最后";库贝条款

Java 使用try with resources或关闭此";“BufferedReader”;在“a”中;最后";库贝条款,java,sonarqube,Java,Sonarqube,我试图实现这段代码,但在sonarqube中的“finally”子句中得到了一些“Use try with resources”或“close this BufferedReader”,我已经阅读了其他人的答案,但他们都没有帮到我,所以有人能告诉我在哪里我必须进行代码更改吗(真的没有sonarqube中上述错误的任何背景) 公共静态列表getlockList(字符串组件路径)引发IOException { List listOfLines=new ArrayList(); BufferedRea

我试图实现这段代码,但在sonarqube中的“finally”子句中得到了一些“Use try with resources”或“close this BufferedReader”,我已经阅读了其他人的答案,但他们都没有帮到我,所以有人能告诉我在哪里我必须进行代码更改吗(真的没有sonarqube中上述错误的任何背景)

公共静态列表getlockList(字符串组件路径)引发IOException
{
List listOfLines=new ArrayList();
BufferedReader-bufReader=null;
试一试{
bufReader=newbufferedreader(newfilereader(componentPath));
String line=bufReader.readLine();
//查找以#(任意数量的#)开头的模式,然后是其后的任意字符串
Pattern r=Pattern.compile((^[#]*)(.*);
while(行!=null){
line=line.trim();
如果(!(“”.等于(行)))
{
if(行匹配(“^#.*))
{
匹配器m=r.匹配器(线);
if(m.find())
{
//System.out.println(“发现值:+m.group(2));
unlockList.add(m.group(2.trim());
}
}
其他的
{
添加(行);
//删除空行
}
line=bufReader.readLine();
}
其他的
{
line=bufReader.readLine();
}
}
}捕获(例外情况除外){
日志信息(ex);
}最后{
if(bufReader!=null)
bufReader.close();
}
返回行列表;
} 

读取文件行的整个逻辑必须被try-catch块包围。这是因为您可能会出现异常,如
FileNotFoundException
等等。读取行后,您必须在
final
子句中关闭缓冲区读取器,因为如果引发异常,则
BufferedReader
可能会发生异常如果不关闭,则会出现内存泄漏问题

您还可以使用try with resources,这是处理可关闭资源的新方法,如
BufferedReader
。这样您就不需要调用
bufReader.close();

以下是oracle文档和示例:

应在类似以下内容的try块中创建BufferedReader:

public static List getlockList(String componentPath) throws IOException 
 {
  List<String> listOfLines = new ArrayList<String>();
  try(BufferedReader bufReader = new BufferedReader(new FileReader( componentPath)))
  {
      // do your magic
  }

  return listOfLines;
}
公共静态列表getlockList(字符串组件路径)引发IOException
{
List listOfLines=new ArrayList();
try(BufferedReader bufReader=new BufferedReader(new FileReader(componentPath)))
{
//施展你的魔法
}
返回行列表;
}

即使出现异常,读卡器也将自动关闭。此外,还有一个规则说明,涵盖了符合要求的解决方案:

您是否查找了术语“”?最后不需要尝试资源沙哈,我的坏@Alex@alex但在sonarqube的描述中,他们已经清楚地写下了结尾,最后,我修改了它accordingly@RajatKrishnan不,他们在“finally”子句中说“使用try with resources或关闭这个“BufferedReader”。注意“or”。这两种方法都有效,但使用try with resources比手动使用finally子句要好。@alex我将使用您的方法并返回u,感谢您的快速响应!!@Fildor您是指类似上面修改的代码吗?@RajatKrishnan是的,这是一种方法。但是您不应该更改问题的代码。这可能导致c为以后的读者提供onfusion。