Java에서는 다음과 같이하고 싶습니다.
try {
...
} catch (/* code to catch IllegalArgumentException, SecurityException,
IllegalAccessException, and NoSuchFieldException at the same time */) {
someCode();
}
…대신에:
try {
...
} catch (IllegalArgumentException e) {
someCode();
} catch (SecurityException e) {
someCode();
} catch (IllegalAccessException e) {
someCode();
} catch (NoSuchFieldException e) {
someCode();
}
이것을 할 수있는 방법이 있습니까?
답변
이것은 Java 7부터 가능했습니다 . 멀티 캐치 블록의 구문은 다음과 같습니다.
try {
...
} catch (IOException | SQLException ex) {
...
}
그러나 모든 예외가 동일한 클래스 계층 구조에 속하는 경우 해당 기본 예외 유형을 간단히 잡을 수 있습니다.
또한 ExceptionB가 ExceptionA에서 직접 또는 간접적으로 상속되는 경우 동일한 블록에서 ExceptionA와 ExceptionB를 모두 잡을 수 없습니다. 컴파일러는 다음과 같이 불평합니다.
Alternatives in a multi-catch statement cannot be related by subclassing
Alternative ExceptionB is a subclass of alternative ExceptionA
답변
Java 7 이전에는 아니지만 다음과 같이 할 것입니다.
자바 6 이전
try {
//.....
} catch (Exception exc) {
if (exc instanceof IllegalArgumentException || exc instanceof SecurityException ||
exc instanceof IllegalAccessException || exc instanceof NoSuchFieldException ) {
someCode();
} else if (exc instanceof RuntimeException) {
throw (RuntimeException) exc;
} else {
throw new RuntimeException(exc);
}
}
자바 7
try {
//.....
} catch ( IllegalArgumentException | SecurityException |
IllegalAccessException |NoSuchFieldException exc) {
someCode();
}
답변
Java 7 내에서 다음과 같은 여러 catch 절을 정의 할 수 있습니다.
catch (IllegalArgumentException | SecurityException e)
{
...
}
답변
예외 계층 구조가있는 경우 기본 클래스를 사용하여 모든 하위 클래스 예외를 포착 할 수 있습니다. 축약 된 경우 다음을 사용하여 모든 Java 예외를 포착 할 수 있습니다 .
try {
...
} catch (Exception e) {
someCode();
}
보다 일반적인 경우에 RepositoryException이 기본 클래스이고 PathNotFoundException이 파생 클래스 인 경우 :
try {
...
} catch (RepositoryException re) {
someCode();
} catch (Exception e) {
someCode();
}
위의 코드는 한 종류의 예외 처리에 대해 RepositoryException 및 PathNotFoundException을 포착하며 다른 모든 예외는 함께 일괄 처리됩니다. Java 7부터 위의 @OscarRyz의 답변에 따라 :
try {
...
} catch( IOException | SQLException ex ) {
...
}
답변
아니요, 고객 당 하나입니다.
모든 경우에 동일한 조치를 취하는 한 java.lang.Exception과 같은 수퍼 클래스를 잡을 수 있습니다.
try {
// some code
} catch(Exception e) { //All exceptions are caught here as all are inheriting java.lang.Exception
e.printStackTrace();
}
그러나 이것이 최선의 방법이 아닐 수도 있습니다. 실제로 처리하기위한 전략이있는 경우에만 예외를 잡아야합니다. 로깅 및 재 투입은 “처리”가 아닙니다. 수정 조치가없는 경우 메소드 서명에 추가하고 상황을 처리 할 수있는 누군가에게 버블 링하도록하십시오.
답변
Java 6 (즉, Android)에 대한 user454322의 답변에 대한 깔끔하지만 덜 장황하고 바람직하지는 않은 대안은 모든 것을 잡고 Exception
다시 던질 것 RuntimeException
입니다. 이 것없는 작품 만약 당신이있는 거 (당신은 또한하지 않는 한 그들을 다시 던져) 더 스택까지 예외의 다른 유형을 잡기에 계획, 그러나 효과적으로 모든 잡을 것 확인 예외.
예를 들어 :
try {
// CODE THAT THROWS EXCEPTION
} catch (Exception e) {
if (e instanceof RuntimeException) {
// this exception was not expected, so re-throw it
throw e;
} else {
// YOUR CODE FOR ALL CHECKED EXCEPTIONS
}
}
즉, 자세한 내용은 부울 또는 다른 변수를 설정하고 try-catch 블록 다음에 일부 코드를 실행하는 것이 가장 좋습니다.
답변
7 이전의 방법은 다음과 같습니다.
Boolean caught = true;
Exception e;
try {
...
caught = false;
} catch (TransformerException te) {
e = te;
} catch (SocketException se) {
e = se;
} catch (IOException ie) {
e = ie;
}
if (caught) {
someCode(); // You can reference Exception e here.
}