简短的回答:如果你处理 IO,你处理IOException
s。如果你不处理 IO,那么IOException
s 应该变成未经检查的异常,因为它们是错误代码的症状。
更长的答案:
readValue
总是需要一个JsonParser
,它可以包裹在 IO 周围(例如一个文件或一个 URL)。如果您正在处理 IO,则无法处理IOException
s,您应该处理它们或以某种方式重新抛出/传递它们。在 IO 期间任何事情都可能发生,您应该准备好处理异常。
但是,如果您确定您的JsonParser
实例不使用 IO(例如,您曾经JsonFactory#createJsonParser(java.lang.String)
在字符串上创建 JSON 解析器),您可能会假设IOException
您收到的任何 s 都是错误,无论是在您的代码中还是在 Jackson 中。通常,抛出未经检查的异常是处理它的正确方法:
ObjectMapper om = new ObjectMapper(/* whatever */);
JsonParser jp = JsonFactory.createJsonParser("{ \"foo\": \"bar\" }");
try {
return om.readValue(jp);
} catch (IOException e) {
throw new AssertionError("An IOException occurred when this was assumed to be impossible.");
}
注意:我的 Java 生锈了,而且我从未使用过 Jackson,所以将上面的代码块视为伪代码。
无论如何,您永远不需要声明AssertionError
in throws
,因为它们是未经检查的异常。所有属于java.lang.RuntimeException
或java.lang.Error
不需要明确捕获或重新抛出的子类。这些异常用于除非您正在处理错误代码或当您的 VM 主机着火时,否则不会发生的问题。