1

ChildException複数のcatch ブロックと 1 つの 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;
    }
}

私の趣味としては、投げるのNullPointerExceptionはいつも悪いので、投げるのはIllegalArgumentException

于 2012-05-22T12:43:38.843 に答える
0

例外の処理に関心がない場合 (ベスト プラクティスに従って処理する必要があります)、明示的なキャッチを気にしないでください。特定の例外を処理できるということの要点は、それらを正しく処理できるようにすることです。

于 2012-05-22T13:27:32.147 に答える