Реализация метода для этого случая в Java - PullRequest
3 голосов
/ 19 марта 2010

Я только что видел фрагмент кода, подобный этому:

private static class DefaultErrorHandler<RT> implements ErrorHandler<RT> {
  public RT handle(Object[] params, Throwable e) {
   return Exceptions.throwUncheckedException(e);
  }
}

Теперь мне интересно, что бы точно вернул статический метод throwUncheckedException (Throwable e) и как он мог бы быть реализован в отношении дженериков.

Кто-нибудь может привести пример?

Ответы [ 3 ]

4 голосов
/ 20 марта 2010

Вы бы определили метод следующим образом:

public static <T> T throwUncheckedException (Throwable e) { ... }

, что по сути означает «для любого типа T, верните его». Затем вы полагаетесь на способность компилятора угадать , что T = RT.

Я думаю, что идея возврата значения из метода throwUncheckedException заключается в следующем: вы хотите вызвать метод, который всегда выдает исключение времени выполнения, и вызываете его из не пустого метода. Компилятор Java жалуется, что вызывающей стороне нужен оператор возврата в конце каждой ветви выполнения. Этот трюк избавляет вас от необходимости "фиктивного возвращения".

1 голос
/ 19 марта 2010

Мне бы пришлось угадать , что оно состоит из:

throw new RuntimeException(e);

но на самом деле, я предполагаю, что возвращаемое значение просто для галочки.Метод называется throw.

Если он что-то возвращает, он возвращает что-то типа «RT», что бы это ни было.

0 голосов
/ 31 марта 2010

Наличие метода throwUncheckedException (), возвращающего что-то, позволяет избежать лишней строки в вызывающем методе, для которого требуется возвращаемое значение.

Было ли выброшено исключение непосредственно из метода handle следующим образом:

public RT handle(Object[] params, Throwable e) {
    throw new RuntimeException(e);
}

Оператор return не понадобился бы (на самом деле он даже был бы недопустим), потому что компилятор мог бы знать, что любой оператор после броска будет недоступен.

Но так как бросок выполняется в другом методе, и так как возвращаемое значение требуется для метода handle, необходимо добавить возвращаемый элемент statemmt.

Наличие в методе throwUncheckedException () чего-либо позволяет вызову находиться в операторе return.

throwUncheckedException () должно быть что-то близкое к:

public static <T> T throwUncheckedException(Throwable e) {
    throw new RuntimeException(e);
    return null;
}

ИМХО, тот факт, что это подняло ваш вопрос, показывает, что это слишком загадочно, чтобы быть достойным. Возможно, лучшим способом достижения той же цели было бы что-то вроде этого:

public RT handle(Object[] params, Throwable e) {
    throw Exceptions.makeUncheckedException(e);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...