假设我们正在编写一个
Java库,它提供了一些I / O ulitity函数,例如,一个方便的方法来读取文本文件作为字符串:
public class StringReader {
private static final Logger log = LoggerFactory.getLog(StringReader.class);
/**
* Returns the contents of file fileName as String.
* @param fileName file name to read
* @return null on IO error
*/
public static String readString(String fileName) {
FileInputStream fis = null;
try {
fis = new FileInputStream(fileName);
byte[] data = new byte[fis.available()];
fis.read(data);
return new String(data, "ISO-8859-1"); // may throw UnsupportedEncodingException!
} catch (IOException e) {
log.error("unable to read file", e);
} catch (UnsupportedEncodingException e) {
log.fatal("JRE does not support ISO-8859-1!", e);
// ???
} finally {
closeQuiet(fis);
}
return null;
}
}
此代码使用ISO-8859-1编码将文本文件读入String,并将String返回给用户.
当不支持指定的编码时,String(byte [],String)构造函数抛出UnsupportedEncodingException.但是,正如我们所知,正如here (see the Standard charsets section)所说,ISO-8859-1必须得到JRE的支持.
因此,我们期待阻止
catch (UnsupportedEncodingException e) {
log.fatal("encoding is unsupported", e);
// ???
}
如果JRE分配符合标准,则永远不会达到.
但如果不是呢?如何以最正确的方式处理此异常?
问题是,如何正确警告这种错误?
建议是:
>抛出某种RuntimeException.
>不要在生产代码中禁用记录器,在日志中写入异常详细信息并忽略它.
>将assert设为false,如果用户使用-ea启动VM,则会产生AssertionError.
>手动抛出AssertionError.
>在方法声明中添加UnsupportedEncodingException并允许用户选择.我觉得不太方便.
>调用System.exit(1).
谢谢.