Краткий ответ: если вы имеете дело с IO, вы имеете дело с IOException
s.Если вы не имеете дело с IO, то IOException
s следует превратить в непроверенные исключения, поскольку они являются признаками ошибочного кода.
Более длинный ответ:
readValue
всегда принимает JsonParser
, который может быть обернут вокруг ввода-вывода (например, файла или URL).Если вы имеете дело с IO, нет никакого способа обойтись с IOException
s, и вы должны либо обработать их, либо отбросить / передать их каким-либо образом.Во время ввода-вывода может произойти что угодно, и вы должны быть готовы справиться с исключениями.
Однако, если вы уверены, что ваши экземпляры JsonParser
не используют ввод-вывод (например, вы использовали 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 ржавая, и я никогда не использовал Джексона, поэтому рассмотрите приведенный выше блок как псевдокод.
В любом случае вам никогда не нужно объявлять AssertionError
в throws
, потому что это непроверенные исключения.Все, что является подклассом java.lang.RuntimeException
или java.lang.Error
, не нужно явно перехватывать или перебрасывать.Эти исключения используются для проблем, которые не должны возникать, если вы не имеете дело с ошибочным кодом или когда хост вашей виртуальной машины горит.