- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
Jackson's ObjectMapper#readValue
成员抛出三个已检查的异常:
IOException
JsonParseException
JsonMappingException
JsonParseException
和 JsonMappingException
扩展 IOException
。我想包装前面提到的两个子类并抛出我自己的自定义异常,但是,正在检查的基类 IOException
要求我也捕获或抛出它。
将 IOException
抛出到调用层对我来说没有任何意义,但不利的是,如果我隐藏它,它会产生异味。我最初的想法是不捕获它并将其留给调用者/运行时异常机制来处理它......但是,我不想强制调用者捕获或指定。
遇到这种情况怎么办?
最佳答案
简短的回答:如果你处理 IO,你就处理 IOException
。如果您不处理 IO,则 IOException
应该变成未经检查的异常,因为它们是错误代码的症状。
更长的答案:
readValue
总是采用一个 JsonParser
,它可以包裹在 IO 周围(例如文件或 URL)。如果您正在处理 IO,则没有办法绕过处理 IOException
,您应该处理它们或以某种方式重新抛出/传递它们。在 IO 期间任何事情都可能发生,您应该准备好处理异常。
但是,如果您确定您的 JsonParser
实例不使用 IO(例如,您使用 JsonFactory#createJsonParser(java.lang.String)
创建一个 JSON字符串上的解析器),您可以假设您收到的任何 IOException
都是错误,无论是在您的代码中还是在 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,因此请将上面的代码块视为伪代码。
在任何情况下,您都不需要在throws
中声明AssertionError
,因为它们是未经检查的异常。 java.lang.RuntimeException
或 java.lang.Error
的子类的所有内容都不需要显式捕获或重新抛出。这些异常用于预期不会发生的问题,除非您正在处理错误代码或当您的 VM 主机着火时。
关于java - jackson 和可怕的 IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7471216/
我们在 session 中存储两个对象。不知何故,来自另一个用户的对象之一被加载到另一个用户的 session 中。用户应该无权访问此特定数据,一旦他们看到它,他们就知道出了什么问题。 我们有向他提供
我现在正在使用 Firefox 5 检查我的网站,我发现字体的呈现很糟糕。 这就是 Firefox (5) 和 Chrome 之间的区别:例如,看看文本 Jeffe 是如何呈现的... 默认字体系列是
我是一名优秀的程序员,十分优秀!