동일한 catch 절에서 여러 Java 예외를 잡을 수 있습니까?
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 (IllegalArgumentException | SecurityException | IllegalAccessException |
NoSuchFieldException e) {
someCode();
}
단, 모든 예외가 동일한 클래스 계층에 속할 경우 해당 기본 예외 유형을 쉽게 파악할 수 있습니다.
또한 둘 다 잡을 수 없습니다.ExceptionA
그리고.ExceptionB
만약이라면 같은 블록에ExceptionB
에서 직접 또는 간접적으로 상속됩니다.ExceptionA
컴파일러는 다음과 같이 불평합니다.
Alternatives in a multi-catch statement cannot be related by subclassing
Alternative ExceptionB is a subclass of alternative ExceptionA
이 문제를 해결하려면 예외 목록에 상위 예외만 포함하면 됩니다. 하위 유형의 예외도 포함되기 때문입니다.
Java 7 이전까지는 아니지만 다음과 같은 작업을 수행합니다.
Java 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();
}
Repository가 다음과 같은 경우예외는 기본 클래스이고 PathNotFoundException은 파생 클래스입니다.
try {
...
} catch (RepositoryException re) {
someCode();
} catch (Exception e) {
someCode();
}
위의 코드는 Repository를 캡처합니다.Exception과 PathNotFoundException은 한 종류의 예외 처리 및 기타 모든 예외로 묶입니다.Java 7 이후, 위의 @OscarRyz의 답변에 따르면:
try {
...
} catch( IOException | SQLException ex ) {
...
}
아니요, Java 7 이전 버전에서는 고객 1인당 1개입니다.
java.lang 같은 슈퍼클래스를 탈 수 있습니다.예외. 모든 경우에 동일한 액션을 취하는 한.
try {
// some code
} catch(Exception e) { //All exceptions are caught here as all are inheriting java.lang.Exception
e.printStackTrace();
}
하지만 그것은 최선의 방법이 아닐 수도 있다.예외를 실제로 처리하는 전략이 있고 기록 및 재투입이 "처리"가 아닌 경우에만 예외를 포착해야 합니다.수정 조치가 없는 경우 메서드 서명에 추가하고 해당 상황을 처리할 수 있는 사람에게 버블업되도록 하는 것이 좋습니다.
JDK 7 이후에서는, 다음의 조작을 실행할 수 있습니다.
try {
...
} catch (IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e) {
someCode();
}
Java 6(즉 Android)에서 사용자 454322의 답변에 대한 보다 깔끔한 답변(단, 덜 상세하고 아마도 선호하지 않을 수 있음)은 모든 것을 파악하는 것입니다.Exception
및 재투구RuntimeException
s. 스택 상부에서 다른 유형의 예외를 캐치할 계획(재투입하지 않는 한)이라면 이 방법은 작동하지 않지만 체크된 모든 예외를 효과적으로 캐치할 수 있습니다.
예:
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
}
}
즉, 상세도를 위해 부울 또는 다른 변수를 설정하고 이를 바탕으로 트라이캐치 블록 후에 코드를 실행하는 것이 가장 좋습니다.
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.
}
매우 간단합니다.
try {
// Your code here.
} catch (IllegalArgumentException | SecurityException | IllegalAccessException |
NoSuchFieldException e) {
// Handle exception here.
}
Kotlin의 경우 현재로선 불가능하지만 추가가 검토되고 있습니다.출처
" " 금금으으간간로로서서", ",의의속속속속속속:
try {
// code
} catch(ex:Exception) {
when(ex) {
is SomeException,
is AnotherException -> {
// handle
}
else -> throw ex
}
}
예외 계층에서 부모 클래스가 될 수 있는 예외를 포착합니다.이것은 물론 나쁜 관행이다.이 경우 일반적인 부모 예외는 Exception 클래스가 됩니다.예외 인스턴스인 예외를 잡는 것은 Null Pointer와 같은 예외입니다.예외는 보통 프로그래밍 오류이며 보통 null 값을 확인하여 해결해야 합니다.
언급URL : https://stackoverflow.com/questions/3495926/can-i-catch-multiple-java-exceptions-in-the-same-catch-clause
'programing' 카테고리의 다른 글
abs 함수나 if 스테이트먼트를 사용하지 않고 절대값을 얻는다. (0) | 2022.07.02 |
---|---|
vue $nextTick을 사용하는 것과 vuejs에서 setTimeout 0을 사용하는 것의 차이점은 무엇입니까? (0) | 2022.07.02 |
가져온 후 내보낸 모듈이 정의되지 않았습니다. (0) | 2022.07.02 |
VueJ가 0이면 입력 값이 표시되지 않음 (0) | 2022.07.02 |
set/getsockopt SO_SNDBUF 사이즈가 2배가 되는 것을 이해한다. (0) | 2022.07.02 |