Но я не хочу окружать оператор блоком try / catch! - PullRequest
19 голосов
/ 02 ноября 2010

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

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

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

Ответы [ 5 ]

24 голосов
/ 02 ноября 2010

Я думаю, вам нужно лучше понять проверенные исключения и их назначение в целом, но это для другого вопроса и ответа .В этом случае, что вы делаете:

 try {
      //etc.
 } catch (UnsupportedEncodingException e) {
      throw new RuntimeException(e.getMessage(), e);
 }
4 голосов
/ 02 ноября 2010

Существует два типа исключений.

  • CheckedException: он заставляет вас использовать try-catch или throw to top программы.
  • UncheckedException: Вы можете обойти .. Это повысит только во время выполнения

Я просто принимаю тот факт, что Java спроектировал этот способ, чтобы сделать программу менее подверженной ошибкам.

2 голосов
/ 03 ноября 2010

Некоторые люди оборачивают RuntimeException, чтобы избежать проверенных исключений. Однако в вашем случае вы знаете, что это исключение не должно произойти. На мой взгляд, это утверждение.

try { 
     //etc. 
} catch (UnsupportedEncodingException e) { 
     throw new AssertionError(e); 
} 

Другой способ перебросить проверенное исключение без его переноса - это выбросить его, как если бы оно было непроверенным исключением. Вы можете попробовать это.

try { 
     // throws a checked exception
} catch (Exception e) { 
     Thread.currentThread().stop(e);
} 
1 голос
/ 02 ноября 2010

UnsupportedEncodingException - это проверенное исключение методом URLDecoder.decode, и вы должны либо перехватить его, либо указать, что ваш метод его выбрасывает.

public static String decodeUTF8String(String s) throws UnsupportedEncodingException 
{
    return java.net.URLDecoder.decode(s, "UTF-8"); 
}

Хороший урок по исключениям

1 голос
/ 02 ноября 2010

Если это вас так сильно беспокоит, то вы всегда можете использовать устаревшую форму с одним аргументом URLDecoder.decode(). Это не принимает параметр encoding и не выдает проверенное исключение.

Конечно, этот метод не рекомендуется по причине - его поведение зависит от кодировки JVM по умолчанию, которая может варьироваться в зависимости от операционной среды. Но если вы знаете, что ваша среда не меняется, это может не иметь значения. Существует также риск того, что метод будет удален в будущих версиях Java, но устаревшие элементы еще не удалены, и я сомневаюсь, что это когда-нибудь произойдет.

...