Java Sonarqube问题-更改此“问题”;试一试;尝试使用资源。如何处理条件资源?

Java Sonarqube问题-更改此“问题”;试一试;尝试使用资源。如何处理条件资源?,java,sonarqube,try-with-resources,Java,Sonarqube,Try With Resources,检查了关于这个主题的类似问题,但我没有找到我的用例的解决方案。 下面的方法将声纳问题显示为主要代码气味as-将此“尝试”更改为资源尝试。 private void readExcel() { Workbook workbook = null; BufferedReader br = null; try { File file = path.toFile(); if (file.get

检查了关于这个主题的类似问题,但我没有找到我的用例的解决方案。
下面的方法将声纳问题显示为
主要代码气味
as-
将此“尝试”更改为资源尝试。

private void readExcel() {
        Workbook workbook = null;
        BufferedReader br = null;
        
        try {
            File file = path.toFile();
            if (file.getName().endsWith(FILE_TYPES.XLS.value) && (file.length() / (1024 * 1024)) < 25) {
                workbook = new HSSFWorkbook(new POIFSFileSystem(file));
                Sheet sheet = workbook.getSheetAt(0);
                readExcel(sheet);
            } else if ((file.getName().endsWith(FILE_TYPES.XLSX.value)) && (file.length() / (1024 * 1024)) < 25) {
                workbook = new XSSFWorkbook(file);
                Sheet sheet = workbook.getSheetAt(0);
                readExcel(sheet);
            } else if (file.getName().endsWith(FILE_TYPES.CSV.value)) {
                // Apache POI cant read/write CSV. Hence using Java IO.
                br = new BufferedReader(new FileReader(file));
                readExcel(br);
            }
        } catch (IOException | InvalidFormatException ex) {
                // set invalid flags and call clean-up
        } finally {
            try {
                if (workbook != null) {
                    workbook.close();
                }
                if (br != null) {
                    br.close();
                }
            } catch (IOException ex) {
                // set invalid flags and call clean-up
            }
        } // try-catch-finally closed
    }
private void readExcel(){
工作簿=空;
BufferedReader br=null;
试一试{
File File=path.toFile();
if(file.getName().endsWith(file_TYPES.XLS.value)&&(file.length()/(1024*1024))<25){
工作簿=新的HSSF工作簿(新的POIFSFS文件系统(文件));
工作表=工作簿。getSheetAt(0);
readExcel(表格);
}else如果((file.getName().endsWith(file_TYPES.XLSX.value))&&(file.length()/(1024*1024))<25){
工作簿=新XSSF工作簿(文件);
工作表=工作簿。getSheetAt(0);
readExcel(表格);
}else if(file.getName().endsWith(file_TYPES.CSV.value)){
//Apache POI无法读/写CSV。因此使用Java IO。
br=新的BufferedReader(新的文件读取器(文件));
readExcel(br);
}
}捕获(IOException | InvalidFormatException ex){
//设置无效标志并调用清除
}最后{
试一试{
如果(工作簿!=null){
workbook.close();
}
如果(br!=null){
br.close();
}
}捕获(IOEX异常){
//设置无效标志并调用清除
}
}//尝试捕获最终关闭
}
这是假阳性声纳问题吗?

是一个可自动关闭的

是可自动关闭的

是可自动关闭的

他们都需要自己的资源

去掉
工作簿=null
BufferedReader br=null,以及
最后
块中的代码,因为这都是旧式的资源预试

private void readExcel(){
试一试{
File File=path.toFile();
if(file.getName().endsWith(file_TYPES.XLS.value)&&(file.length()/(1024*1024))<25){
try(工作簿=新的HSSF工作簿(新的POIFSFS文件系统(文件))){
工作表=工作簿。getSheetAt(0);
readExcel(表格);
}
}else如果((file.getName().endsWith(file_TYPES.XLSX.value))&&(file.length()/(1024*1024))<25){
try(工作簿=新XSSF工作簿(文件)){
工作表=工作簿。getSheetAt(0);
readExcel(表格);
}
}else if(file.getName().endsWith(file_TYPES.CSV.value)){
//Apache POI无法读/写CSV。因此使用Java IO。
try(BufferedReader br=new BufferedReader(new FileReader(file))){
readExcel(br);
}
}
}捕获(IOException | InvalidFormatException ex){
//设置无效标志并调用清除
}
}

至少BufferedReader可以尝试使用resources块,所以请这样做。考虑到前两个操作使用公共基类型
工作簿
,并且在其他方面也相同,我不会说它们需要自己尝试使用资源。@Holger嗯,它们确实需要自己的构造函数调用,由于构造函数调用通常在
try
括号中,因此它们会得到自己的块。但是你是对的,它们可以结合在一起,但是对于这个简单的代码来说几乎没有必要。当然,人们对哪种代码重复量是可以接受的有不同的看法。由于共享代码会略微提高复杂性,因此五行代码是一种临界情况。对我来说,即使重复三次
file.getName()
也感觉不对…