17. 예외처리 (Exception, try-catch-finally) (2)
이 포스트에서는 자바의 예외처리 try-catch-finally 문에 대해 알아보도록 한다.
이전 포스트
목표
- try-catch
- try-catch-finally
- finally 는 언제 사용할까?
try-catch
public class Main {
public static void main(String[] args) {
String sentenceToCheck = null;
StringChecker checker = new StringChecker();
if(checker.endingWithSemicolon(sentenceToCheck)) {
System.out.println("이 문장은 세미콜론으로 끝난다.");
} else {
System.out.println("이 문장은 세미콜론으로 끝나지 않는다.");
}
}
}
public class StringChecker {
public boolean endingWithSemicolon(String sentence) {
try {
return sentence.endsWith(";");
} catch (NullPointerException e) {
System.out.println("예외 발생!");
return false;
}
}
private void mustRun() {
System.out.println("이 메서드는 무조건 실행되어야 한다.");
}
}예외 발생!이 문장은 세미콜론으로 끝나지 않는다.
public class StringChecker {
public boolean endingWithSemicolon(String sentence) {
try {
boolean isEndingWithSemicolon = sentence.endsWith(";");
mustRun();
return isEndingWithSemicolon;
} catch (NullPointerException e) {
System.out.println("예외 발생!");
mustRun();
return false;
}
}
private void mustRun() {
System.out.println("이 메서드는 무조건 실행되어야 한다.");
}
}
public class StringChecker {
public boolean endingWithSemicolon(String sentence) {
boolean isEndingWithSemicolon = false;
try {
isEndingWithSemicolon = sentence.endsWith(";");
} catch (NullPointerException e) {
System.out.println("예외 발생!");
}
mustRun();
return isEndingWithSemicolon;
}
private void mustRun() {
System.out.println("이 메서드는 무조건 실행되어야 한다.");
}
}
try-catch-finally
public class StringChecker {
public boolean endingWithSemicolon(String sentence) {
try {
return sentence.endsWith(";");
} catch (NullPointerException e) {
System.out.println("예외 발생!");
return false;
} finally {
mustRun();
}
}
private void mustRun() {
System.out.println("이 메서드는 무조건 실행되어야 한다.");
}
}
public class StringChecker {
public boolean endingWithSemicolon(String sentence) {
try {
return sentence.endsWith(";");
} catch (NullPointerException e) {
System.out.println("예외 발생!");
} finally {
mustRun();
}
try {
System.out.println("또 다른 try-catch");
} finally {
System.out.println("또 다른 finally");
}
return false;
}
private void mustRun() {
System.out.println("이 메서드는 무조건 실행되어야 한다.");
}
}
예외 발생!
이 메서드는 무조건 실행되어야 한다.
또 다른 try-catch
또 다른 finally
이 문장은 세미콜론으로 끝나지 않는다.
public class StringChecker {
public boolean endingWithSemicolon(String sentence) {
try {
return sentence.endsWith(";");
} catch (NullPointerException e) {
System.out.println("예외 발생!");
int zero = 0;
int dividedByZero = 3/zero;
return dividedByZero > 1;
} finally {
mustRun();
}
}
private void mustRun() {
System.out.println("이 메서드는 무조건 실행되어야 한다.");
}
}
예외 발생!
이 메서드는 무조건 실행되어야 한다.
Exception in thread "main" java.lang.ArithmeticException: / by zero
at StringChecker.endingWithSemicolon(StringChecker.java:10)
at Main.main(Main.java:6)
finally는 언제 사용할까?
Connection conn = null;
try {
conn = DriverManager.getConnection(databaseURL, user, password);
// some other logic here
} catch (SQLException e) {
// handling the exceptions
} finally {
conn.close();
}
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class SynchronizableClass {
Lock lock = new ReentrantLock();
public void runWithCriticalSection() {
lock.lock();
try {
// critical section
} catch (NullPointerException e) {
} finally {
lock.unlock();
}
}
}
끝
연습문제
try 문 안에 또 try 문을 넣을 수 있다. 이중으로 try를 넣는 경우 예외 발생시 어떤 순서로 프로그램이 실행될지 예측할 수 있는가?
public class StringChecker {
public boolean endingWithSemicolon(String sentence) {
try {
System.out.println("endingWithSemicolon 연산 시작.");
try {
System.out.println("Arithmetic 연산 시작.");
int zero = 0;
int dividedByZero = 3/zero;
System.out.println("Arithmetic 연산 종료.");
return dividedByZero > 1;
} catch (ArithmeticException e) {
System.out.println("ArithmeticException 발생!");
} finally {
System.out.println("ArithmeticException finally 실행.");
}
System.out.println("endingWithSemicolon 연산 리턴 시도.");
return sentence.endsWith(";");
} catch (NullPointerException e) {
System.out.println("endingWithSemicolon 예외 발생!");
return false;
} finally {
mustRun();
}
}
private void mustRun() {
System.out.println("이 메서드는 무조건 실행되어야 한다.");
}
}
다음 포스트: 17. 예외처리 (Exception, throw and throws) (3)