Java의 다양한 비정상 처리 방식을 깊이 있게 분석하다
public static void enterTryMethod() {
System.out.println("enter after try field");
}
public static void enterExceptionMethod() {
System.out.println("enter catch field");
}
public static void enterFinallyMethod() {
System.out.println("enter finally method");
}
2. Exception을 던지고finally가 없으면catch가return을 만나면
public static int catchTest() {
int res = 0;
try {
res = 10 / 0; // Exception,
enterTryMethod();
return res; // Exception ,
} catch (Exception e) {
enterExceptionMethod();
return 1; // Exception ,
}
}
백그라운드 출력 결과:
enter catch field
1
3. Exception을 던져서catch체에return이 있으면finally체의 코드 블록은catch가return을 실행하기 전에 실행됩니다
public static int catchTest() {
int res = 0;
try {
res = 10 / 0; // Exception,
enterTryMethod();
return res; // Exception ,
} catch (Exception e) {
enterExceptionMethod();
return 1; // Exception ,
} finally {
enterFinallyMethod(); // Exception ,finally catch return
}
}
백그라운드 출력 결과:
enter catch field
enter finally method
1
4. Exception을 던지지 않고,finally 코드 블록에서return을 만나면,finally가 실행되면 모든 방법을 끝냅니다.
public static int catchTest() {
int res = 0;
try {
res = 10 / 2; // Exception
enterTryMethod();
return res; // , finally
} catch (Exception e) {
enterExceptionMethod();
return 1;
} finally {
enterFinallyMethod();
return 1000; // finally return , return , try catch ,
}
}
백그라운드 출력 결과:
enter after try field
enter finally method
1000
5. Exception을 버리지 않고finally 코드 블록에서 System을 만납니다.exit () 방법은 방법이 아니라 전체 프로그램을 종료하고 종료합니다.
public static int catchTest() {
int res = 0;
try {
res = 10 / 2; // Exception
enterTryMethod();
return res; // , finally ,
} catch (Exception e) {
enterExceptionMethod();
return 1;
} finally {
enterFinallyMethod();
System.exit(0); // finally System.exit() ,System.exit() ,
}
}
백그라운드 출력 결과:
enter after try field
enter finally method
6. Exception을 던져서catch와finally가 동시에 Return을 만나면catch의return 반환값은 되돌아오지 않습니다.finally의return 문장은 모든 방법을 끝내고 되돌아옵니다.
public static int catchTest() {
int res = 0;
try {
res = 10 / 0; // Exception,
enterTryMethod();
return res; // Exception ,
} catch (Exception e) {
enterExceptionMethod();
return 1; // Exception , , finally
} finally {
enterFinallyMethod();
return 10; // return , 10
}
}
백그라운드 출력 결과:
enter catch field
enter finally method
10
7. Exception을 던지지 않고,finally가return을 만나면try의return반환값은 되돌아오지 않습니다.finally의return문장은 모든 방법을 끝내고 되돌아옵니다.
public static int catchTest() {
int res = 0;
try {
res = 10 / 2; // Exception
enterTryMethod();
return res; // , finally
} catch (Exception e) {
enterExceptionMethod();
return 1;
} finally {
enterFinallyMethod();
return 10; // return , 10
}
}
백그라운드 출력 결과:
enter after try field
enter finally method
10
결론자바의 이상 처리에서 프로그램이 try 안의 코드 블록을 실행한 후에 이 방법은 즉각 끝나지 않고 이 방법에finally 코드 블록이 있는지 계속 찾으려고 합니다
만약finally 코드 블록이 없다면, 모든 방법은try 코드 블록을 실행한 후에 상응하는 값을 되돌려 모든 방법을 끝냅니다.
만약finally 코드 블록이 있다면, 프로그램은try 코드 블록에 있는return 한마디를 실행할 때 return을 즉시 실행하지 않고, 먼저finally 코드 블록에 있는 코드를 실행합니다
만약finally 코드 블록에return이 없거나 프로그램을 종료할 수 있는 코드가 없다면, 프로그램은finally 코드 블록 코드를 실행한 후try 코드 블록에return 문장을 실행하여 모든 방법을 끝냅니다.만약finally 코드 블록에return이 있거나 프로그램을 종료할 수 있는 코드가 포함되어 있다면, 방법은finally를 실행한 후에 끝나고try 코드 블록으로 되돌아와return을 실행하지 않습니다
이상을 던지는 상황에서도 원리는 위와 같다. 위에서 말한 try를catch로 바꾸어 이해하면 된다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.