예외란 ??
예외는 사용자의 조작이 이상하거나, 개발자의 코딩이 잘못되었을 때 발생하는 프로그램 오류이다.
예외(Exception) vs 에러(Error)
https://ko.gadget-info.com/difference-between-error
여기 잘 설명되어 있으니, 이걸 읽어보면 좋을 것 같다.
요약하자면
에러는 시스템 자원이 부족해서 발생하며 복구 불가함.
예외는 코드가 잘못되어서 발생하며 예외처리를 통해 복구 가능함.
자바에서는 예외가 발생할 가능성이 높은 코드를 컴파일 시 예외처리 유무를 확인한다.
예외처리가 되지 않아 있다면 컴파일이 되지 않음.
예외
일반 예외와 실행 예외가 있다.
일반 예외 ( Compiler Check Exception : 컴파일러 체크 예외 )
위에서 말했듯이 자바는 컴파일하는 과정에서 예외 발생 확률이 높은 코드에 대해서 예외처리 유무를 확인하는데,
예외처리 코드가 없으면 컴파일 오류가 발생한다.
실행 예외 ( Compiler None Check Exception )
실행 시 예측할 수 없이 갑자기 발생한 예외.
컴파일 과정에서 예외 처리 코드가 있는지 검사하지 않기 때문에 발생.
예외 클래스
자바에서는 예외를 클래스로 관리한다. JVM ( Java Virtual Marchine)이 프로그램을 실행하는 중에 예외가 발생하면
해당 예외 클래스로 객체를 생성해
만들어진 예외 객체를 예외 처리 코드에서 이용할 수 있도록 해준다.
모든 예외의 최상위 클래스는 java.lang.Exception이다.
일반 예외와 실행 예외의 차이는 실행 유무라고 볼 수 있는데,
간단하게 RuntimeException의 하위 클래스라면 실행 예외 , 그렇지 않으면 일반 예외라고 볼 수 있다.
실행 예외 클래스
실행 예외는 자바 컴파일러가 체크하지 않기 때문에 개발자가 예외 처리 코드를 작성해야 한다.
만약에 예외 처리를 하지 않았다면 예외 발생 시 프로그램은 종료한다.
대표적인 실행 예외 클래스
대표적인 예외 클래스이지만. 예외 이름만 봐도 웬만하면 알 수 있기 때문에 외우진 말기.
- NullPointerException - 객체 참조가 없는 상태. null 값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생
- ArrayIndexOutBoundsException - 인덱스 범위를 벗어난 것을 사용할 때 발생.
- NumberFormatException - 숫자로 변환할 수 없는 문자가 있을 때.
- ClassCastException - 자바에서의 다형성으로 상위 클래스와 하위 클래스 간에 타입 변화를 할 수 있다.
하지만 상위 하위 관계가 아닌데 변환한다면 발생하는 에러.
예외 처리
위에서 말한 대로 예외처리 코드가 있다면 프로그램이 비정상적으로 종료하지 않을 수 있기 때문에.
개발자는 예외 처리를 제대로 해 주어야 한다.
기본적으로 사용 문법은 다음과 같다.
try{//실행할 코드를 작성
}catch(예외클래스 e ){// 예외가 발생했을 때 해당 예외를 () 안에 적고 처리할 코드를 작성
}finally{
// 예외가 생기든 안 생기든 실행하는 코드
}
catch 문은 아래와 같이 예외 처리할 만큼 여러번 사용할 수 있다.
try{//실행할 코드를 작성
}catch(ArrayIndexOutOfBoundsException e ){// 하위 예외 클래스 먼저 작성해야 이쪽에 들어감.
}catch(Exception e ){// 상위 예외 클래스는 밑에 위치하는게 개발자가 원하는 대로 흘러감
}finally{
// 예외가 생기든 안 생기든 실행하는 코드
}
catch의 순서
다중 catch문을 쓸 때에는 위처럼 사용할 수 있지만, Exception이 위로 올라간다면 모든 예외는 Exception을 상속하기 때문에 제일 큰 Exception으로 다 예외가 들어가면서 의도와 다르게 흘러갈 수 있기 때문에 하위 -> 상위 예외 클래스로 catch 문을 작성하는게 바람직하다.
예외 떠넘기기 throws
try - cath 문 이외에도 예외를 처리 할 수 있는 방법이 있는데 , throws라는 키워드이다.
public void run1(){
try{
run2();
}catch(Exception e){
//예외 처리 코드
System.out.println("예외 떠넘기기 받음");
}
}
public void run2() throws Exception{
Class c1 = Class.forName("java.lang.없는클래스");
}
위를 보면 run1 메소드에서 run2 메소드를 호출하고 run2 메소드는 throws로 예외를 떠넘긴다.
만약 c1이 클래스를 찾지 못해서 에러가 난다면 run2를 실행한 run1에서 예외처리를 하게된다.
예외처리를 넘기려면 run2 메소드는 꼭 호출 되는 곳의 try 문 안에서 실행되어야 한다.
'Java' 카테고리의 다른 글
Java - 객체 개념과 클래스의 기본적인 모습 (0) | 2022.03.05 |
---|---|
Java - java.lang 패키지 (0) | 2022.02.28 |
Java 제어문 - 반복문 ( for , while , do-while 문 ) (0) | 2022.02.12 |
Java 제어문 - 조건문 ( if / switch 문 ) (0) | 2022.02.11 |
JVM의 개념 - 자바 동작 과정 아주 기초! (0) | 2022.02.03 |