【发布时间】:2018-05-18 17:17:07
【问题描述】:
我编写了从文本文件中读取文本(json、xml 等)的代码,并将其转换为字符串,然后其他代码可以使用该字符串将其转换为由 jackson 注释的普通旧 java 对象或 POJOS .
我不确定我的代码是否正确处理了异常。到目前为止,我已经使用了在我的代码之后提到的原则(请阅读 DOWN VOTERS !!!)来开发代码。请注意,我不能对资源使用 try,因为我坚持使用 Java 6(即使我的项目 JRE 是 1.8)。
package com.testing;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class JunkEx {
public static void main(String[] args) {
String filePath = ".\\src\\test\\resources\\text-files\\orders\\orders-2017.txt";
String contents = fileToString(filePath);
System.out.println(contents);
}
private static String fileToString(String filePath) {
StringBuilder stringBuilder = null;
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(filePath));
stringBuilder = new StringBuilder();
String currentLine;
while ((currentLine = br.readLine()) != null) {
stringBuilder.append(currentLine);
stringBuilder.append("\n");
}
}catch (FileNotFoundException ex1) {
ex1.printStackTrace();
}catch (IOException ex2) {
ex2.printStackTrace();
}finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return stringBuilder.toString();
}
}
原则:
1) 首先捕获最具体的异常,然后是异常层次结构中高于它的异常。即第一次捕获 FileNotFoundException 和稍后捕获 IOException。 Refer point 5 here
2) 不要从 finally 块内部返回,因为只要 try 完全或突然“完成”,finally 总是会执行。 Refer this SO answer.
3) 清理 finally 块中的缓冲读取器等资源。 Refer point 1 here.
4) 不要让“危险”方法的调用者(即可能抛出异常),必须知道/抛出其中的每个异常。即危险方法不应该“抛出 FileNotFoundException、IOException...等”。 refer this link, specifically the last paragraph
代码中的缺陷: 如果前两个 catch 块中的任何一个被执行,那么很可能整个文件都没有被读取。但是,我的方法无论如何都会返回一个字符串。字符串可能为空或不完整。
问题 -
1) 我想在文本文件未成功转换为字符串时抛出异常,即执行三个 catch 块之一。我应该将异常包装在通用 Exception 对象内的每个 catch 块中并抛出它还是做其他事情?
2)如何改进/修复此代码的异常处理?
【问题讨论】:
-
请说明为什么我得到了反对票。我努力阅读并找出如何编写我的代码。我所要求的只是修复/改进它的提示或指示。我该如何改进这个问题?