Jackson’s ObjectMapper#readValue member throws three checked exceptions:
IOException JsonParseException JsonMappingException
JsonParseException and JsonMappingException extend IOException. I want to wrap the two aforementioned child classes and throw my own custom exceptions, yet, the base class, IOException, being checked, requires me to either catch or throw it also.
It doesn’t make sense for me to throw the IOException up to the calling layer, but, adversely, it’s a smell if I hide it. My original thought was to not catch it and leave it to the caller/run-time exception mechanism to deal with it… yet, I don’t want to have to force the caller to catch or specify.
What does one do in such a situation?
Short answer: if you deal with IO, you deal with
IOExceptions. If you don’t deal with IO, thenIOExceptions should be turned into unchecked exceptions, because they’re symptoms of buggy code.Longer answer:
readValuealways takes aJsonParser, which may be wrapped around IO (e.g. a file or a URL). If you’re dealing with IO, there’s no way around dealing withIOExceptions, and you should either handle them or rethrow/pass them in some way. Anything can happen during IO, and you should be prepared to deal with the exceptions.However, if you are sure that your
JsonParserinstances don’t use IO (e.g. you usedJsonFactory#createJsonParser(java.lang.String)to create a JSON parser on a string), you may assume that anyIOExceptions you receive are bugs, either in your code or in Jackson. Usually, throwing an unchecked exception is then the proper way to deal with it:Nota bene: my Java is rusty and I’ve never used Jackson, so consider the above block to be pseudocode.
In any case, you never need to declare
AssertionErrorinthrows, because they’re unchecked exceptions. Everything that’s a subclass ofjava.lang.RuntimeExceptionorjava.lang.Errordoesn’t need to be caught or rethrown explicitly. These exceptions are used for problems that are not expected to occur unless you’re dealing with buggy code or when your VM’s host is on fire.