Sonarqube 问题 - 将此 "try" 更改为 try-with-resources。如何处理条件资源?
Sonarqube issue - Change this "try" to a try-with-resources. How to handle conditional resources?
检查了关于此主题的类似问题,但我没有找到适合我的用例的解决方案。
以下方法将 Major code smell
的声纳问题显示为 - Change this "try" to a try-with-resources.
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
}
这是误报声纳问题吗?
HSSFWorkbook
是一个 AutoCloseable
.
XSSFWorkbook
是一个 AutoCloseable
.
BufferedReader
是一个 AutoCloseable
.
他们都需要自己的try-with-resources.
删除 Workbook workbook = null;
和 BufferedReader br = null;
,以及 finally
块中的代码,因为那是 old-style pre-try-with-resources.
private void readExcel() {
try {
File file = path.toFile();
if (file.getName().endsWith(FILE_TYPES.XLS.value) && (file.length() / (1024 * 1024)) < 25) {
try (Workbook 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) {
try (Workbook 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.
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
readExcel(br);
}
}
} catch (IOException | InvalidFormatException ex) {
// set invalid flags and call clean-up
}
}
检查了关于此主题的类似问题,但我没有找到适合我的用例的解决方案。
以下方法将 Major code smell
的声纳问题显示为 - Change this "try" to a try-with-resources.
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
}
这是误报声纳问题吗?
HSSFWorkbook
是一个 AutoCloseable
.
XSSFWorkbook
是一个 AutoCloseable
.
BufferedReader
是一个 AutoCloseable
.
他们都需要自己的try-with-resources.
删除 Workbook workbook = null;
和 BufferedReader br = null;
,以及 finally
块中的代码,因为那是 old-style pre-try-with-resources.
private void readExcel() {
try {
File file = path.toFile();
if (file.getName().endsWith(FILE_TYPES.XLS.value) && (file.length() / (1024 * 1024)) < 25) {
try (Workbook 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) {
try (Workbook 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.
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
readExcel(br);
}
}
} catch (IOException | InvalidFormatException ex) {
// set invalid flags and call clean-up
}
}