[Java] 자바 - 예외처리를 위한 try-catch-finally 문
자바 - 예외처리를 위한 try-catch-finally 문
자바 프로그램 실행중에 발생하는 오류를 예외(Exception)라고 합니다. 예를들면 정수를 0으로 나누게 되면 ArithmeticException이 발생되어 프로그램이 강제 종료됩니다.
만약 이와같은 오류상황들이 프로그램 실행중에 발생할 가능성이 있다면, 이에 적절히 대응할 수 있는 코드를 작성해 주어야 합니다. 이때 사용하는 코드가 try-catch-finally문입니다.
이와 같이 프로그램 실행중 발생할 수 있는 오류상황에 대처하는 방법인 예외처리에 대해서 알아보도록 하겠습니다.
목차
- 예외처리란?
- 예외처리를 위한 try-catch-finally문
- checked예외 vs unchecked예외
- 임의로 예외 발생시키기 (throw 키워드)
- 예외 던지기 (throws 키워드)
1. 예외처리란?
예외처리란 프로그램 실행중에 발생하는 오류 즉, 예외(Exception)가 발생되었을 때, 프로그램이 강제종료되지 않고 정상 처리될 수 있도록 하는 방법을 말합니다.
2. 예외처리를 위한 try-catch-finally문
예외처리를 위해서 사용되는 문법은 try-catch-finally문이며, 이중 catch문은 예외타입에 따라 여러개를 사용할 수 있습니다. 그리고 finally문은 필요하지 않을 경우 생략 할 수 있습니다.
1) 작성방법
- try문안에 예외가 발생할 수 있는 코드를 작성합니다. try문안의 코드는 실행중에 예외가 발생하게 되면 예외가 발생한 시점의 코드에서 예외타입이 일치하는 catch문으로 이동하게 됩니다.
- catch문안에는 예외 발생시 처리해야 될 코드를 작성합니다.
- 마지막으로 finally문에는 예외 발생여부와 상관없이 실행되어야 할 코드가 있을 경우 작성하며, 필요없을 경우 생략할 수 있습니다.
try {
① 예외가 발생할 수 있는 코드;
} catch (발생할 수 있는 예외 타입) {
② 예외처리 코드;
} finally {
③ 예외와 상관없이 무조건 실행되는 코드;
}
- 예외가 발생하지 않은 경우 : ①번 → ③번 순으로 코드가 진행됩니다.
- 예외가 발생한 경우 : ①번(에러발생코드까지만 실행) → ②번 → ③번 순으로 코드가 진행됩니다.
2) 예외정보 메소드 : getMessage()와 printStackTrace()
예외가 발생되면 예외에 따른 예외객체가 생성됩니다. 그리고 이 객체에 속한 메소드를 통해 예외 정보에 접근할 수 있습니다. 대표적인 메소드로 getMessage()와 printStackTrace()가 있으며 catch문 안에서 사용됩니다.
- getMessage( ) : 예외 내용을 반환합니다.
- printStackTrace( ) : 예외 발생위치와 내용을 알려줍니다.
(1) 예제코드
package com.study;
public class HelloWorld {
public static void main(String[] args) {
int num = 0;
int result = 0;
try {
result = 10 / num;
} catch(Exception e) {
e.printStackTrace();
System.out.println("예외발생내용: " + e.getMessage());
} finally {
System.out.println("finally: 무조건 실행 구문");
}
}
}
(2) 실행결과
java.lang.ArithmeticException: / by zero
at com.study.HelloWorld.main(HelloWorld.java:9)
예외발생내용: / by zero
finally: 무조건 실행 구문
3. checked예외 vs unchecked예외
Exception클래스의 상속도는 아래와 같습니다. 예외중에는 try-catch문으로 필히 처리해야 하는 예외과 그렇지 않은 예외가 있는데, try-catch문으로 꼭 처리해야 하는 예외를 checked예외, 그렇지 않은 예외를 unchecked 예외라고 합니다.
checked예외가 발생할 수 있는 코드의 경우 try-catch문으로 예외 처리를 해주지 않으면 컴파일시에 에러가 발생합니다.
RuntimeException 클래스와 그 하위클래스들은 모두 unchecked예외이며, 나머지 Exception클래스와 그 하위 클래스들은 checked예외에 속합니다.
4. 임의로 예외 발생 시키기 (throw 키워드)
프로그램 코드중 내가 임의로 예외상황을 발생시켜 처리하고 싶을 때는 Exception 객체를 생성후 throw 키워드를 통해 예외를 발생시킬수 있습니다.
throw new Exception("임의로 발생시킨 예외");
1) 예제코드
package com.study;
public class HelloWorld {
public static void main(String[] args) {
try {
throw new Exception("임의로 발생시킨 예외");
} catch(Exception e) {
e.printStackTrace();
System.out.println("예외발생내용: " + e.getMessage());
} finally {
System.out.println("finally: 무조건 실행 구문");
}
}
}
2) 실행결과
java.lang.Exception: 임의로 발생시킨 예외
at com.study.HelloWorld.main(HelloWorld.java:6)
예외발생내용: 임의로 발생시킨 예외
finally: 무조건 실행 구문
5. 예외 던지기 (throws 키워드)
지금까지는 예외처리를 위해서 예외가 발생할 가능성이 있는 코드를 try-catch 문으로 감싸 처리를 하였습니다. 그런데 예외가 발생할 가능성이 있는 곳에서 직접 처리하지 않고, 해당구문이 속한 메소드를 호출하는 쪽에서 처리하게도 할 수 있습니다.
이렇게 호출한 쪽으로 예외를 던져버릴때 사용되는 키워드가 바로 throws 키워드입니다.
1) 예제코드
package com.study;
public class HelloWorld {
public static void main(String[] args) {
try {
myCalculator();
} catch(Exception e) {
e.printStackTrace();
System.out.println("예외발생내용: " + e.getMessage());
}
}
static public void myCalculator() throws Exception {
throw new Exception("임의로 발생시킨 예외");
}
}
try-catch문 처리를 myCalculator() 메소드안에서 처리해도 되지만, throws 키워드를 통해 해당 메소드를 호출한 곳에서 처리하도록 하였습니다.
2) 실행결과
java.lang.Exception: 임의로 발생시킨 예외
at com.study.HelloWorld.myCalculator(HelloWorld.java:14)
at com.study.HelloWorld.main(HelloWorld.java:6)
예외발생내용: 임의로 발생시킨 예외