finally블럭은 try-catch문과 함께 사용된다.
단, 예외의 발생여부와는 관계없이 실행되어야할 코드를 포함한다.
try { // 예외가 발생할 가능성이 있는 문장
. . .
}
catch(Exception3 e){ // 예외발생 시 처리를 위한 문장
. . .
}
finally{ // 예외와 관계없이 항상 실행되어야 할 문장
. . .
}
public class FinallyTest {
public static void main(String[] args) {
try {
startInstall(); // 프로그램 설치 메서드
copyFiles(); // 파일복사 메서드
deleteTempFiles(); // 프로그램 설치에 사용된 임시파일 삭제 메서드
} catch (Exception e) {
e.printStackTrace();
deleteTempFiles(); // 프로그램 설치에 사용된 임시파일 삭제
}
}
static void startInstall() {
/* 프로그램 설치에 필요한 파일을 준비하는 코드 */
}
static void copyFiles() {
/* 파일들을 복사하는 코드 */
}
static void deleteTempFiles() {
/* 임시파일을 삭제하는 코드 */
}
}
위 코드의 경우 deleteTempFiles()가 여러 번 겹친다.
deleteTempFiles()는 예외발생여부에 관계없이 실행되어야하므로
다음과 같이 finally블럭을 사용해준다.
public class FinallyTest {
public static void main(String[] args) {
try {
startInstall(); // 프로그램 설치 메서드
copyFiles(); // 파일복사 메서드
} catch (Exception e) {
e.printStackTrace();
} finally {
deleteTempFiles(); // 프로그램 설치에 사용된 임시파일 삭제
}
}
static void startInstall() {
/* 프로그램 설치에 필요한 파일을 준비하는 코드 */
}
static void copyFiles() {
/* 파일들을 복사하는 코드 */
}
static void deleteTempFiles() {
/* 임시파일을 삭제하는 코드 */
}
}
중복을 제거할 수 있다.
try문에 return문이 실행되어 메서드가 종료되는 경우에도
finally블럭의 문장들이 먼저 실행된 뒤 종료된다.
catch문에서 return문을 만나도 마찬가지이다.