1

catch 블록이 여러 개있는 경우 ChildException 블록과 Exception 블록 사이의 차이점은 무엇입니까? 에 의해 더 나은, 나는 좋은 - 방법 방식으로 의미합니다. 여러 개의 "ChildException"catch 블록이 하나의 "예외"catch 블록

는 설명하기 :

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; 
    } 
} 
+0

거짓을 반환하는 것이 전부라면 사례를 전문적으로 다루지 않아도됩니다. – ron

답변

4

던져 왜 NullPointerException이 항상 나쁜 이잖아 던지는 : Catch multiple exceptions at once?

을 거기에 대한 대답은 좋습니다. 열쇠는 Exception을 붙잡는 경우에 당신이 알고있는 각각의 케이스와 throw 나머지를 처리해야한다는 것입니다. 즉, 단순히 Exception을 catch하고 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; 
     } 
    } 
} 
+0

'instanceof'를':)'로 사용 해주셔서 감사합니다. – sp00m

+0

이 방법을 사용하는 한 가지 단점은 ** checked exception을 처리 할 때 컴파일러가 더 이상 경고하지 않는다는 것입니다 ** 'try' 블록에있는 코드에 의해 throw 될 수 없습니다. – Luke

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; 
    } 
} 

을 내 맛, 나는이이 질문에 관련되어있는 IllegalArgumentException

0

: 귀하의 예제를 사용

, 여기 내 제안 코드입니다. 특정 예외를 처리 할 수있는 전체 요점은 올바르게 처리 할 수 ​​있도록하는 것입니다.

관련 문제