Но я не хочу, чтобы окружать выражение блоком try/catch!
Я пишу программу, которая использует java.net.URLDecoder.decode(String value, String encoding)
. По-видимому, этот метод может вызвать UnsupportedEncodingException
, который я получаю. Но я просто передаю "UTF-8" в качестве кодировки. Это исключение не будет выбрано.
Я мог бы просто окружить чертовую вещь блоком catch, который ничего не делает, но затем, в любом случае, из-за чего исключение будет выброшено, я не узнаю об этом. Я также не хочу создавать большую цепочку throws UnsupportedEncodingException
до верхней части моей программы.
Что я могу сделать здесь? Почему мне приходится иметь дело с некоторыми исключениями, в то время как другие (например, IllegalArgumentException
, NullPointerException
) мне разрешено игнорировать?
Ответы
Ответ 1
Я думаю, вам нужно лучше понять проверенные исключения и их цель в целом, но это для еще один вопрос и ответ. В этом случае вы делаете следующее:
try {
//etc.
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e.getMessage(), e);
}
Ответ 2
Существует два типа исключения.
- CheckedException: это заставляет вас использовать try-catch или бросать в начало программы.
- UncheckedException: вы можете обойти.. Он будет повышаться только во время выполнения
Я просто согласен с тем, что Java разработала этот способ, чтобы сделать программу менее подверженной ошибкам.
Ответ 3
Некоторые люди переносят исключение RuntimeException во избежание отмеченных исключений. Однако в вашем случае вы знаете, что это исключение не должно происходить. На мой взгляд, это утверждение.
try {
//etc.
} catch (UnsupportedEncodingException e) {
throw new AssertionError(e);
}
Другой способ сбросить проверенное исключение без его упаковки - это выбросить его, как если бы это было исключение. Вы можете попробовать это.
try {
// throws a checked exception
} catch (Exception e) {
Thread.currentThread().stop(e);
}
Ответ 4
Если это вас так сильно беспокоит, вы всегда можете использовать устаревшую форму с одним аргументом URLDecoder.decode()
. Это не принимает параметр encoding
и не выдает проверенное исключение.
Конечно, этот метод устарел по какой-то причине - его поведение зависит от кодировки по умолчанию JVM, которая может варьироваться в зависимости от операционной среды. Но если вы знаете, что ваша среда не меняется, это не имеет значения. Также существует риск того, что метод будет удален в будущих версиях Java, но никакие устаревшие элементы еще не удалены, и я сомневаюсь, что это когда-нибудь произойдет.
Ответ 5
UnsupportedEncodingException - это проверенное исключение с помощью метода URLDecoder.decode, и вы должны либо поймать его, либо указать, что ваш метод выдает его.
public static String decodeUTF8String(String s) throws UnsupportedEncodingException
{
return java.net.URLDecoder.decode(s, "UTF-8");
}
Хороший урок об исключениях