충분히 쌓여가는
예외 처리하기, try-catch문 본문
예외 처리(exception handing)
정의 | 프로그램의 실행시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것 |
목적 | 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것 |
try-catch 문
예외처리할 때 사용하는 문
if문과 달리, try 블럭이나 catch 블럭 내에 포함된 문장이 하나뿐이어도 괄호{}를 생략할 수 없다
try {
// 예외가 발생할 가능성이 있는 문장들을 넣는다
} catch (Exception1 e1) {
// Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 넣는다
} catch (Exception2 e2) {
// Exception2이 발생했을 경우, 이를 처리하기 위한 문장을 넣는다
} catch (ExceptionN eN) {
// ExceptionN이 발생했을 경우, 이를 처리하기 위한 문장을 넣는다
}
try 블럭 내에서 예외가 발생한 경우
1. 발생한 예외와 일치하는 catch 블럭이 있는지 확인한다
2. 일치하는 catch 블럭을 찾게 되면 그 catch 블럭 내의 문장들을 수행하고, 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 만일 일치하는 catch 문장을 찾지 못하면, 예외는 처리되지 못한다
class Exception {
public static void main(String args[]) {
System.out.println(1);
try {
System.out.println(0/0); // 예외 발생
System.out.println(2);
} catch (ArithmeticException ae) {
System.out.println(3);
} // try-catch 끝
System.out.println(4);
}
}
1
3
4
try 블럭 내에서 예외가 발생하지 않은 경우
1. catch 블럭을 거치지 않고 전체 try-catch 문을 빠져나가서 수행을 계속한다
class Exception {
public static void main(String args[]) {
System.out.println(1);
try {
System.out.println(2);
System.out.println(3);
} catch (Exception e) {
System.out.println(4); // 실행되지 않음
} // try-catch 끝
System.out.println(5);
}
}
1
2
3
5
코드
두 번째 catch문에 Exception: 모든 예외의 최고조상으로 모든 예외처리가능하기 때문에 제일 마지막 catch 문에 와야한다
public class ExceptionTest {
public static void main(String[] args) {
System.out.println(1);
System.out.println(2);
try {
System.out.println(3);
System.out.println(0 / 0); // 0으로 나눠 고의로 ArithmeticException을 발생시킨다
System.out.println(4); // 실행되지 않는다
} catch (ArithmeticException ae) {
if (ae instanceof ArithmeticException)
System.out.println("true");
System.out.println("ArithmeticException");
} catch (Exception e) { // ArithmeticException을 제외한 모든 예외가 처리된다
System.out.println("Exception");
} // try-catch의 끝
System.out.println(6);
}
}
1
2
3
true
ArithmeticException
6
예외처리 되지않은 코드
public class ExceptionTest {
public static void main(String[] args) {
System.out.println(1);
System.out.println(2);
try {
System.out.println(3);
System.out.println(args[0]); // ArrayIndexOutOfBoundException
System.out.println(4); // 실행되지 않는다
} catch (ArithmeticException ae) {
if (ae instanceof ArithmeticException)
System.out.println("true");
System.out.println("ArithmeticException");
} // try-catch의 끝
System.out.println(6);
}
}
1
2
3
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
at ExceptionTest.main(ExceptionTest.java:7)
예외처리된 코드
ArrayIndexOutOfBoundsException 대신 최고조상인 Exception으로 해도된다
public class ExceptionTest {
public static void main(String[] args) {
System.out.println(1);
System.out.println(2);
try {
System.out.println(3);
System.out.println(args[0]); // ArrayIndexOutOfBoundException
System.out.println(4); // 실행되지 않는다
} catch (ArithmeticException ae) {
if (ae instanceof ArithmeticException)
System.out.println("true");
System.out.println("ArithmeticException");
} catch (ArrayIndexOutOfBoundsException e) {
// catch (Exception e) // 모든 예외의 최고조상인 Exception
System.out.println("ArrayIndexOutOfBoundsException");
} // try-catch의 끝
System.out.println(6);
}
}
1
2
3
ArrayIndexOutOfBoundsException
6
'Java > JAVA2' 카테고리의 다른 글
멀티 catch 블럭 (0) | 2023.06.22 |
---|---|
printStackTrace(), getMessage() (0) | 2023.06.22 |
프로그램 오류, 예외 클래스의 계층구조 (0) | 2023.06.19 |
익명 클래스(anonymous class) (0) | 2023.06.19 |
내부 클래스의 제어자와 접근성 (0) | 2023.06.18 |