자바 통신 에서 finally 키 워드 를 만 났 습 니 다.
최근 간단 한 socket 통신 개발 을 공부 하고 있 습 니 다. 인터넷 자 료 를 찾 을 때 이상 메커니즘 을 알 아 볼 때 주의 하지 않 았 던 것 이 finally 키워드 입 니 다.
코드 는 아래 와 같 고 중간 부분 은 생략 합 니 다.
DataInputStream dis = null;
DataOutputStream dos = null;
try {
cServerSocket = new ServerSocket(PORT);
while (true) {
System.out.println(" ...");
cSocket = cServerSocket.accept();
dis = new DataInputStream(cSocket.getInputStream());
dos = new DataOutputStream(cSocket.getOutputStream());
String clientStr = dis.readUTF();
dos.writeUTF(" :" + clientStr);
/** ,,**/
System.out.println("---------------------------------");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (dis != null) {
dis.close();
}
if (dos != null) {
dos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
finally 키 워드 를 사용 하지 않 을 때 스 트림 대상 을 닫 는 방법 을 작성 해 야 하 며, close () 방법 이 이상 여부 와 상 관 없 이 실 행 될 수 있 도록 해 야 합 니 다. finally 키 워드 를 사용 할 수 있 습 니 다.
finally 블록 은 try 블록 에 이상 이 있 든 없 든 close 방법 이 항상 실 행 됩 니 다.따라서 이 방법 을 종료 하기 전에 항상 close 방법 을 사용 할 수 있 도록 확보 할 수 있다.이렇게 하면 close () 방법 이 이미 실행 되 었 고 자원 이 누설 되 지 않 았 다 는 것 을 확신 할 수 있다.이 방법 에는 catch 블록 이 하나 더 필요 없습니다.
finally 블록 은 try 나 try/catch 블록 과 함께 사용 해 야 합 니 다.또한, finally 블록 을 실행 하지 않 고 try 블록 을 종료 할 수 없습니다.finally 블록 이 존재 한다 면, 그것 은 항상 실 행 될 것 입 니 다.
/* * * * * * * * * * 분할 선 이 라 고 들 었 습 니 다 * * * * * * * * * * */
이상 은 제 가 finally 키워드 가 제 코드 에서 의 활용 에 대해 알 고 있 지만 더 잘 알 고 있 을 때 입 니 다.
finally 키 워드 를 사용 하 는 문 제 는 finally 에 대응 하 는 try 구문 블록 이 실 행 된 경우 에 만 finally 구문 블록 이 실 행 됩 니 다.try 구문 블록 전에 되 돌아 오 거나 이상 을 던 졌 을 경우 try 에 대응 하 는 finally 구문 블록 이 실행 되 지 않 았 습 니 다.
예 를 들 면:
package Test;
public class Test {
public static void main(String[] args) {
System.out.println("return value of test(): " + test());
}
public static int test() {
int i = 1;
System.out.println("the previous statement of try block");
i = i / 0;
try {
System.out.println("try block");
return i;
}catch(Exception e){
e.printStackTrace();
return 0;
}
finally {
System.out.println("finally block");
}
}
}
이 이 치 는 분명 한 것 같 습 니 다. 코드 가 try 문 구 를 실행 하지 않 았 기 때문에 이상 이 생 겼 을 때 실행 을 중단 합 니 다. 즉, 아래 코드 를 계속 실행 하지 않 습 니 다.try 전에 값 을 하나 반환 하면 효과 도 마찬가지 입 니 다.
그러나, 내 가 계속 알 아 보 았 을 때, 만약 에 하나의 라인 이 try 문장 블록 이나 catch 문장 블록 을 실행 할 때 끊 기거 나 (interrupted) 중지 되 거나 (killed) 종료 되면, 그 에 대응 하 는 finally 문장 블록 은 실행 되 지 않 을 수도 있다.
종합해 보면 try 문 구 는 정상적으로 실행 되 고 실행 이 중단 되 지 않 으 면 finally 문 구 는 반드시 실 행 될 것 이다.
그러나 만약 에 finally 블록 의 집행 순 서 를 깊이 연구 하려 면 자바 언어 규범 을 직접 알 아 보 는 것 이 좋 습 니 다. 먼저 여기까지 하 겠 습 니 다. 저 는 안 드 로 이 드 통신 을 쓰 러 가 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.