일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 싱글톤
- 콜렉션
- 내장객체
- 언박싱
- Jenkins
- bootstrap
- 싱글턴
- 제너릭
- boxing
- 무한
- https://start.spring.io
- 빌드
- suvlet
- start.spring.io
- 스프링
- 컬렉션
- Java
- 자동형변환
- Short
- 클래스
- 인텔리제이
- dependency
- wrapper
- maven
- 루프
- 메소드
- Scanner
- 박싱
- unboxing
- 제네릭
- Today
- Total
Developer Gonie
[2주차] 52. 예외처리, try - catch - (finally) 구문 본문
* 예외(Exception)처리란?
에러에는 컴파일 중 발생하는 '컴파일에러'와 실행 중 발생하는 '런타임에러'가 있다.
'컴파일에러' 는 코드상의 오타 등의 에러이고,
'런타임에러'는 배열에서 크기를 벗어난 접근을 하는 것과 같은 에러이다.
그런데 '런타임에러'에는 '에러'와 '예외'가 존재한다.
'에러'는 메모리 부족 등의 프로그램 코드에 의해 수습될 수 없는 오류이고
'예외'는 프로그램 코드에서 수습될 수 있는 다소 미약한 오류이다.
try-catch문이 다루는 예외는 바로 이것이다. '런타임에러'에 속하는 '예외'
* 예외(Exception)처리를 왜 해주는가?
프로그램 실행시 예외가 발생하게 되면 프로그램이 강제로 비정상 종료되어 버리는데,
발생할 수 있는 예외에 대비한 코드를 작성해두면 도중에 종료되는 것 없이 실행상태를 유지할 수 있다.
* 예외 객체가 생성되는 타이밍
실행중에 예외가 발생하면 그자리에서 갑자기 new (ArithmeticException) 하며 예외 객체가 생성된다.
* try - catch - (finally) 에서 알아야할 흐름
try안에 발생할 예외가 10개 있어도 처음 발생한 예외 딱 1개만 처리하고 이를 벗어난다.
예외 발생시 예외 처리 후 다음줄을 처리하기 위해 다시 그 자리로 되돌아 오지 않는 것이다.
catch문은 예외가 발생할 경우에만 가게되며, 예외에 따라 처리 방식을 다르게 하기 위해 여러개가 존재할 수 있다.
맨 위의 catch 문 부터 예외 객체와 참조변수 타입이 일치하는 지를 차례대로 비교하며 일치할 때 까지 내려간다.
일치하는걸 찾았다면 다음 catch 문으로 넘어가지 않는다.
추가적으로 fianlly문을 넣을 수 있는데, 넣어줘도 되고, 안넣어줘도 된다.
finally문은 예외가 발생하여 catch를 간 경우에만 catch 부분 처리한 다음에 들리게 되는 흐름이다.
* 대부분의 예외 클래스는 Exception을 상속받아 만들어졌기 때문에 다형성에 의해 Exception 타입의 참조변수로
모든 예외 객체를 받을 수 있다. 이 때문에 catch문에서 Exception 를 사용하게될경우 맨 아래서 사용하는게 좋다.
ex) Exception e = new ArithmeticException
try{
} catch(..){
} catch(Exception e){ // Exception e = (Exception)new ArithmeticException()
}
코드
public class Ex07_01_예외처리 {
public static void main(String[] args) {
try {
String str = null; // str은 String클래스의 참조변수
System.out.println(str);
System.out.println();
System.out.println(str.length()); // 예외가 발생해 자동으로 new NullPointerException 예외 객체가 생성됨.
System.out.println("예외가 위에서 발생해 여기까지 오지 못함");
// 아래서 e는 NullPointerException 클래스 타입의 참조변수임
} catch (NullPointerException e) { // if (e == NullPointerException) 비교문임
System.out.println("예외 발생해서 오게된 catch문");
} finally { // 있어도 되고 없어도 되는 finally, 예외가 발생해야지만 catch문을 거쳐 올 수 있는 곳임
System.out.println("예외 발생해서 catch를 지나 오게된 fianlly 부분");
}
}
}
실행결과
null
예외 발생해서 오게된 catch문
예외 발생해서 catch를 지나 오게된 fianlly 부분
'K-DigitalTraining 강의 > 1. Java' 카테고리의 다른 글
[2주차] 54. 예외처리, throw를 이용해 강제로 예외 발생시키기 (0) | 2022.06.02 |
---|---|
[2주차] 53. 예외처리, throws를 이용해 예외를 다른 곳에서 처리하기 (0) | 2022.06.01 |
[2주차] 51. 인터페이스, 인터페이스와 클래스 상속을 동시에 받는 예제 (0) | 2022.06.01 |
[2주차] 50. 인터페이스, 추상클래스와의 차이점*** (0) | 2022.06.01 |
[2주차] 49. 추상클래스, 반드시 만들어야할 것에 대해 미완성된 밑그림을 그려두는 것 (0) | 2022.05.27 |