Подтвердить что ты не робот

Но я не хочу, чтобы окружать выражение блоком try/catch!

Я пишу программу, которая использует java.net.URLDecoder.decode(String value, String encoding). По-видимому, этот метод может вызвать UnsupportedEncodingException, который я получаю. Но я просто передаю "UTF-8" в качестве кодировки. Это исключение не будет выбрано.

Я мог бы просто окружить чертовую вещь блоком catch, который ничего не делает, но затем, в любом случае, из-за чего исключение будет выброшено, я не узнаю об этом. Я также не хочу создавать большую цепочку throws UnsupportedEncodingException до верхней части моей программы.

Что я могу сделать здесь? Почему мне приходится иметь дело с некоторыми исключениями, в то время как другие (например, IllegalArgumentException, NullPointerException) мне разрешено игнорировать?

4b9b3361

Ответ 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"); 
}

Хороший урок об исключениях