반응형
예외처리란?
- 프로그램 실행 중 예외가 발생할 수 있는데, 이때 이를 어떻게 처리할 건지 등을 미리 대처하는 코드를 작성하는 것
- 예외처리를 통해 프로그램의 정상 작동을 보장할 수 있으며, 예외의 원인 파악, 예외 정보 기록 등을 할 수 있음.
예외의 종류
- 예외의 종류로는 오류(Error), CheckedException, UncheckedException( = RuntimeException)으로 구분
- Error는 시스템의 문제로 인해 발생하기 때문에 Error가 발생하면 프로그램을 종료시키는 것이 일반적임
- ex) OutOfMemory, StackOverflow
- CheckedException은 예외처리를 반드시 해야하고, 안하면 컴파일 에러가 발생함
- ex) IOException, FileNotFoundException, …
- UncheckedException은 예외처리를 강제하지 않음, RuntimeException이라고도 함
- ex) ArithmeticException, ArrayIndexOutOfBoundsException, …
예외처리 종류
- try - catch - finally
- throws
try - catch - finally 란?
- try 부분에서 예외가 발생할 가능성이 있는 코드를 작성하고
- catch 부분에서는 try 부분에서 예외 발생 시, 어떻게 처리할지에 대한 코드를 작성
- finally 부분은 있어도 되고 없어도 되는데, try - catch 이후에 예외 발생 여부와 상관 없이 실행됨
try - catch - finally 예제
package ExceptionTest;
public class Main {
public static void main(String[] args) {
int a;
try {
a = 12 / 0;
System.out.println(a);
} catch(Exception e) {
System.out.println("에러 발생");
e.printStackTrace(); // 예외 발생 위치와 원인 출력
// e.toString(), e.getMessage()등 으로 간단하게 출력도 가능함
} finally {
System.out.println("종료");
}
}
}
- 위 코드에선 값을 0으로 나누기 때문에 예외가 발생함
- 정확히는 ArithmeticException이 발생하는데, Exception은 이를 포함한 모든 exception과 상속관계여서 Exception으로 받을 수 있음
- 만약 exception의 종류에 따라 catch문을 다르게 하고 싶다면 catch문을 여러개 써주고 각각의 파라미터 자리에 서로 다른 exception 명을 써주면 됨
throws 란?
- 예외가 발생할 수 있는 메서드 뒤에 throws + 예외종류를 붙여줌으로서 자신을 호출한 상위 메서드로 예외를 던져줌
- 만약 main 메소드 뒤에 throws가 있다면 이는 JVM으로 예외를 던져줌
- JVM으로 던지는것 보다는 그 전에 어딘가에서는 예외 처리를 직접 해주는 방식 추천
throws 예제
package ExceptionTest;
public class Main {
public static void divide(int a, int b) throws Exception {
System.out.println(a + " / " + b + " = " + a/b);
}
public static void main(String[] args) {
try {
divide(12, 0);
} catch(ArithmeticException e) {
System.out.println("계산 오류");
e.printStackTrace();
} catch(Exception e) {
System.out.println("기타 예외 발생");
e.printStackTrace();
}
}
}
결과
throw 란?
- throw 메소드를 통해서 개발자가 임의로 에외를 직접 발생시킬 수도 있음
throw new IOException();
위의 throws 예제를 아래와 같이 조금 수정해봄
package ExceptionTest;
public class Main {
public static void divide(int a, int b) throws Exception {
// System.out.println(a + " / " + b + " = " + a/b);
throw new IOException();
}
public static void main(String[] args) {
try {
divide(12, 0);
} catch(ArithmeticException e) {
System.out.println("계산 오류");
e.printStackTrace();
} catch(Exception e) {
System.out.println("기타 예외 발생");
e.printStackTrace();
}
}
}
결과
- 결과는 아래와 같이 try 문에서 exception이 잡히는데 ArithmeticException이 아니므로 "기타 예외 발생"이 출력됨
반응형
'JAVA > 기본 문법' 카테고리의 다른 글
[JAVA] 시간 관련 ( 시간측정, 현재날짜/시간, 날짜/시간 포맷, 타이머 ) (0) | 2022.04.14 |
---|---|
[JAVA] 쓰레드 (Thread), SingleThread, MultiThread 예제 (0) | 2022.04.14 |
[JAVA] Stack & Queue (0) | 2022.04.13 |
[JAVA] 컬렉션 프레임워크 - 3. List (0) | 2022.04.13 |
[JAVA] 컬렉션 프레임워크 - 2. Set (+ iterator) (0) | 2022.04.12 |