【问题标题】:Understanding catching checked exceptions了解捕获检查的异常
【发布时间】:2015-11-02 06:25:01
【问题描述】:

我正在阅读 J. Bloch 的 Effective 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);
}

问题是我不知道应该在异常处理程序中放什么。我在 if 条件下执行访问检查:

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

因此IllegalAccessViolation 永远不会被抛出。此外,为什么检查IllegalAccessViolation 似乎有点困惑。我认为这是一个编程错误,根据他所说的来判断:

对调用者可以使用的条件使用检查异常 预计会恢复

[...]

使用运行时异常 指出编程错误

我虽然它应该是一个不受约束的。

问题:如果我们确保永远不会在某个地方抛出异常,那么将已检查异常的处理程序留空是否合适?

【问题讨论】:

    标签: java exception checked-exceptions


    【解决方案1】:

    不要忽略异常,而是添加

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

    到 catch 块。这样,如果您误解了文档并且这个IllegalAccessException 异常有效地发生了,或者如果有人修改了代码并删除了使这个IllegalAccessException 异常不可能的检查,那么您将有一个明确的异常,并带有一个堆栈跟踪指示问题所在的精确位置,而不是稍后出现的问题,在不相关的代码中,或更糟糕的是:有效但不正确的结果。

    【讨论】:

      猜你喜欢
      • 2020-01-11
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多