2015-11-02 4 views
1

Я читаю эффективную Java-версию Дж. Блоха и теперь я нахожусь в разделе о проверенных/непроверенных исключениях. Он сказал, что (подчеркнуть мой):Общие сведения об исключениях, отмеченных проверкой ловли

противостоя пользователь API с клетчатым исключением, API дизайнер пред- сентами мандата для восстановления из условия. Пользователь может игнорировать мандат, улавливая исключение и игнорируя его, но обычно это Плохая идея (Пункт 65).

Теперь рассмотрим метод, возвращающий список всех статических данных членов класса, имеющих один и тот же тип или подтип:

public static <T> List<? extends T> getPublicStaticFields(Class<T> clazz){ 
    List<T> fields = new ArrayList<>(); 
    for(Field f : clazz.getDeclaredFields()){ 
     if(Modifier.isStatic(f.getModifiers()) && 
       Modifier.isPublic(f.getModifiers())){ 
      Object fieldValue; 
      try { 
       fieldValue = f.get(null); 
       if(clazz.isAssignableFrom(fieldValue.getClass())) 
        fields.add((T) fieldValue); 
      } catch (IllegalAccessException e) { } // <------- Ignoring the execption 
     } 
    } 
    return Collections.unmodifiableList(fields); 
} 

Дело в том, я понятия не имею, что я должен положить в обработчик исключений. Я выполнять проверку в состоянии, если доступ:

f(Modifier.isStatic(f.getModifiers()) && 
    Modifier.isPublic(f.getModifiers())) 

поэтому IllegalAccessViolation никогда не будет выброшено. Кроме того, кажется немного запутанным, почему отмечен IllegalAccessViolation. Я думаю, что это ошибка программирования, и judjing тем, что он сказал:

использования проверяемых исключений для условий, из которых абонент может разумно ожидать, чтобы восстановить

[...]

исключения использования во время выполнения в указывают на ошибки программирования

Я, хотя он должен быть неквалифицированным.

ВОПРОС: ли это сочтено целесообразным оставить Hadler проверяемого исключения пустым, если мы обеспечили, что expcetion никогда не будет выброшено где-то раньше?

ответ

3

Вместо того, чтобы игнорировать исключение, добавить

throw new AssertionError("this should never happen"); 

к блоку улова. Таким образом, если вы неправильно поняли документацию и это исключение IllegalAccessException эффективно, или если кто-то изменяет код и удаляет проверки, которые делают исключение этого исключения IllegalAccessException невозможным, вы получите четкое исключение со стеком, указывающим точное местоположение, где проблема скорее, чем проблема позже, в несвязанном коде или, что еще хуже: действительный, но неверный результат.

+0

На самом деле, хороший совет. Большое спасибо. –