1

ChildException几个catch 块和一个catch 块之间哪个更好Exception?我所说的更好,是指以一种好的做法

为了显示:

public static void main(String[] args) {
    System.out.println(Main.isNonsense1(null)); // false <- bad
    System.out.println(Main.isNonsense2(null)); // NullPointerException <- good
}

// More readable, less precise
public static boolean isNonsense1(String className) {
    try {
        Class.forName(className);
        String.class.getConstructor(String.class);
        className.getBytes("UTF-8");
        MessageDigest.getInstance("SHA-1").wait();
        return true;
    } catch (Exception e) {
        return false;
    }
}

// Less readable, more precise
public static boolean isNonsense2(String className) {
    try {
        Class.forName(className);
        String.class.getConstructor(String.class);
        className.getBytes("UTF-8");
        MessageDigest.getInstance("SHA-1").wait();
        return true;
    } catch (ClassNotFoundException e) {
        return false;
    } catch (NoSuchMethodException e) {
        return false;
    } catch (SecurityException e) {
        return false;
    } catch (UnsupportedEncodingException e) {
        return false;
    } catch (NoSuchAlgorithmException e) {
        return false;
    } catch (InterruptedException e) {
        return false;
    }
}
4

3 回答 3

4

这与这个问题有关:一次捕获多个异常?

那里的答案很好。关键是,如果你抓住了,Exception那么你应该处理你知道的每个案例以及throw所有其他案例。也就是说,简单地在您的示例中捕获 Exception 并返回 false并不是一个好主意。您可能会无意中捕捉到一些您无意捕捉的异常。

使用您的示例,这是我建议的代码:

public static boolean isNonsense2(String className) {
    try {
        Class.forName(className);
        String.class.getConstructor(String.class);
        className.getBytes("UTF-8");
        MessageDigest.getInstance("SHA-1").wait();
        return true;
    } catch (Exception e) {
        if (e instanceof ClassNotFoundException
                || e instanceof NoSuchMethodException
                || e instanceof SecurityException
                || e instanceof UnsupportedEncodingException
                || e instanceof NoSuchAlgorithmException
                || e instanceof InterruptedException) {
            return false;
        } else {
            throw e;
        }
    }
}
于 2012-05-22T12:47:17.360 回答
1

我认为没有完全明确的答案。在你的情况下,我会这样编码:

public static boolean isNonsense1(String className) {
    if(slassname==null) throw new IllegalArgumentException("className must not be null");
    try {
        Class.forName(className);
        String.class.getConstructor(String.class);
        className.getBytes("UTF-8");
        MessageDigest.getInstance("SHA-1").wait();
        return true;
    } catch (ClassNotFoundException e) {
        throw new IllegalArgumentException("provided class " + className + " not found");
    } catch (Exception e) {
        return false;
    }
}

就我的口味而言,扔 aNullPointerException总是不好的,这就是为什么我扔IllegalArgumentException

于 2012-05-22T12:43:38.843 回答
0

如果您对处理异常不感兴趣(根据最佳实践您应该这样做),请不要为显式捕获而烦恼。能够处理特定异常的全部意义在于使您能够正确处理它们。

于 2012-05-22T13:27:32.147 回答