자바 통신 에서 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 블록 의 집행 순 서 를 깊이 연구 하려 면 자바 언어 규범 을 직접 알 아 보 는 것 이 좋 습 니 다. 먼저 여기까지 하 겠 습 니 다. 저 는 안 드 로 이 드 통신 을 쓰 러 가 겠 습 니 다.
 

좋은 웹페이지 즐겨찾기