1

我有看起来像这样的方法:

public static <U extends Entity<?, ?>> Http<List<U>> getAllFromServerThreadRun(Integer maxResults, Class<U> clazz) {
        JsonObject o2 = new JsonObject(); // TODO exception chaos im projekt
                                            // überarbeiten
        o2.addProperty("maxResults", maxResults);

        String s;
        Type t;
        try {
            U o = clazz.getConstructor().newInstance();
            s = (String) clazz.getDeclaredMethod("getControllerName").invoke(o);
            t = (Type) clazz.getDeclaredMethod("getListType").invoke(o);
        } catch (IllegalArgumentException e) {
            ExceptionHandler.handle(e);
        } catch (SecurityException e) {
            ExceptionHandler.handle(e);
        } catch (InstantiationException e) {
            ExceptionHandler.handle(e);
        } catch (IllegalAccessException e) {
            ExceptionHandler.handle(e);
        } catch (InvocationTargetException e) {
            ExceptionHandler.handle(e);
        } catch (NoSuchMethodException e) {
            ExceptionHandler.handle(e);
        }
        return new Http<List<U>>(new HttpGet(), s, "getall", t).setParams(o2).queryServer();
    }

到目前为止,我的项目中可能有 10 个。

我有一个替代的 Java 反射库可以为我隐藏这些异常吗?我不知道该怎么处理它们,它只是杂乱无章。

4

3 回答 3

4

我建议

catch (Exception e) {
            ExceptionHandler.handle(e);
}
于 2013-01-09T22:03:47.993 回答
2

在 java 7 中,您可以在每个 catch 中捕获多种异常类型:

try {
    // reflection stuff
} catch (IllegalArgumentException |
         SecurityException |
         InstantiationException |
         etc e) {
    ExceptionHandler.handle(e);
}

我很同情你想catch (Exception e)要这样做,因为反射方法抛出了许多类型的异常,但是这样做会带来无意中捕获未经检查的异常的危险,比如NullPointerException可能会掩盖错误。

如果你还在 Java 6 领域,恐怕你最好把它吸干。

于 2013-01-09T22:14:39.830 回答
0

从 Java 7 开始,所有与反射相关的异常都扩展了java.lang.ReflectiveOperationException,因此您只需要捕获它。

其他异常(IllegalArgumentException 和 SecurityException)是未经检查的异常,您根本不应该捕获它们。如果发生其中任何一种情况,则您的代码中存在错误。正确的做法不是捕获异常,而是修复导致异常的代码。

具体来说,我可以看到 IllegalArgumentException 永远不会发生的代码,因为它只有在您传递一个invoke类型不正确的对象时才会发生,而且我可以看到您正在传递一个类的实例,该类的方法您'正在调用。只有当您根本不允许访问这些方法时,才会发生 SecurityException。

于 2013-01-10T00:02:25.763 回答