2020. 1. 20. 09:22ㆍCSE/JAVA
* Exception(일반 예외)
: 컴파일러 체크 예외
자바 소스를 컴파일하는 과정에서 예외 처리 코드가 필요하지 않음
일반 예외 클래스 : Exception을 상속받지만 Runtime Exception을 상속받지 않는 클래스
* Runtime Exception(실행 예외)
: 컴파일하는 과정에서 예외 처리 코드를 검사하지 않는 예외
개발자의 경헝메 의해서 예외 처리 코드를 삽입해야 함
실행 예외 클래스 : Exception, Runtime Exception을 상속받는 클래스
- NullPointerException : 객체 참조가 없는 상태, null값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 때 발생
- ArrayIndexOutOfBoundsException : 배열에서 인덱스 범위를 초과하여 사용할 경우 발생
- NumberFormatException : parseXXX() 메소드 이용 시, 숫자로 변환될 수 없는 문자가 포함되어 있을 때 발생
- ClassCastException : 상위 클래스와 하위 클래스 관계가 아닌데 억지로 타입변환을 시도할 경우 발생
타입 변환 전에 타입 변환이 가능한지 instanceof으로 확인하면 좋음
* 예외 처리 코드
: 프로그램에서 예외가 발생했을 경우, 프로그램의 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는 코드
try-catch-finally 블록을 이용
public class TryCatchFinallyExample{
public staic void main(String[] args){
try {
//예외 발생 코드
Class c = Class.forName("java.lang.String2");
//Class.forName() : 클래스 존재 확인하는 메소드
} catch (ClassNotFoundException e){
//예외처리
System.out.println("클래스가 존재하지 않습니다.");
} finally {
//항상 실행
System.out.println("TryCatchFinallyExample 종료");
}
}
}
* 다중 catch
: 다양한 종류의 예외를 잡기 위함
catch 블록이 여러 개라 할지라도 단 하나의 catch 블록만 실행됨
=> 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 함
ex. Exception > ArrayIndexOutOfBoundsException 이므로 Exception이 아래쪽에 위치해야 함
* 멀티 catch
: 하나의 catch 블록에서 여러 개의 예외를 처리할 수 있음
catch 괄호 안에 동일하게 처리하고 싶은 예외를 |로 연결하면 됨
ex. catch (ArrayIndexOutOfBoundsException | NumberFormatException e)
* 자동 리소스 닫기
: 예외 발생 여부와 상관 없이 사용했던 리소스 객체의 close() 메소드를 호출해서 리소스를 닫아준다
try-with-resources 사용
+ 리소스 : ex. 입출력 스트림, 소켓 등
* 예외 떠넘기기
: 메소드 내부에서 예외가 발생할 수 있는 코드를 만들 때, 메소드를 호출한 곳으로 예외를 떠넘길 수 있음
public class Example{
public staic void main(String[] args){
try{
method();
} catch (ClassNotFoundException e){
System.out.println("ClassNotFoundException 발생");
}
}
}
public void method() throws ClassNotFoundException{
Class c = Class.forName("java.lang.String2");
}
* 사용자 정의 예외 클래스
: 필드, 생성자, 메소드 선언을 포함할 수 있지만, 대부분 생성자 선언만 포함
생성자는 두 개를 선언하는 것이 일반적
=> 기본 생성자, 예외 메세지 전달 위해 String 타입의 매개 변수를 갖는 생성자
public class PersonalException extends Exception{
//Exception 클래스를 상속해야 함
public PersonalException(){} //기본 생성자
public PersonalException(String message){ //매개 변수를 갖는 생성자
super(message);
}
}
'CSE > JAVA' 카테고리의 다른 글
[자바 객체 지향] 자바와 절차적/구조적 프로그래밍 2 (0) | 2021.07.30 |
---|---|
[자바 객체 지향] 자바와 절차적/구조적 프로그래밍 1 (0) | 2021.07.26 |
05. Anonymous Inner Class (0) | 2020.01.19 |
04. Nested Class, Nested Interface (0) | 2020.01.19 |
03. Annotation (0) | 2020.01.13 |