목차
- Exception(예외)와 에러의 차이
- 예외 계층 구조
- 예외처리 사용법
- 사용자 정의 예외 처리 방법
Exception(예외)와 에러의 차이
프로그램을 사용하던 도중 프로그램이 비정상적으로 종료되는 현상을 에러 또는 오류라고 한다.
에러는 두 가지로 나뉘는데 컴파일 에러(컴파일 과정에서 일어나는 것)와 런타임 에러(컴파일이 문제없이 실행되고 실행 과정에서 일어나는 것)로 나누어진다.
런타임 에러)
1. 에러는 메모리부족 스택오버플로우 같이 하드웨어적인 시스템 상의 문제에서 발생하는 에러이다.
2. 예외는 컴퓨터 상의 에러가 아닌 개발자의 잘못된 코딩으로 인한 또는 사용자의 잘못된 조작으로 인해 발생하는 것이다.
예외가 발생할 경우 에러와 같이 프로그램이 종료되지만 예외처리를 통해 프로그램이 종료되지 않고 정상적으로 작동되게끔 해줄 수 있다.
예외 계층 구조
모든 예외 클래스는 Throwable 클래스를 상속받고 있으며 Throwable을 상속받은 클래스는 Error와 Exception 클래스가 있음
Exception은 크게 RuntimeException에 속한 클래스인 UnChecked Exception과 RuntimeException이 아닌 Checked Exception으로 구분된다.
UnCheckedException이 발생할 가능성이 있는 경우에는 예외처리가 필요하다...
(컴파일 전에 오류를 알려주지 않으므로 개발자가 알기어려움)
Checked Exception 예시)
FileWriter f = null;
try {
f = new FileWriter("data.txt");
f.write("Hello");
}catch (IOException e){
e.printStackTrace();
}finally {
// File 의 경우 .close() 통해서 자원을 해제 해줘야됨
// close() 메서드 호출도 IOException 발생할 수 있기 때문에 예외처리 해줘야됨
try {
f.close();
} catch (IOException e) {
e.printStackTrace();
}
}
File , DB , 네트워크 연결과 같은 작업은 자바 외부에 존재하는 resource 이므로 .close() 메서드를 통해서 자원을 반납해야 된다.
resource 작업을 포함하는 예외처리 작업(DB,네트워크,File) - 자바 7 이상부터 추가된 기능
try(FileWriter f1 = new FileWriter("data.txt")){
f1.write("Hello");
} catch (IOException e) {
e.printStackTrace();
}
try with resource (. close명시적으로 쓰지 않아도 내부적으로 close 메서드를 호출한다)
예외처리 사용법)
단일 try-catch )
try{
// 예외가 발생할 가능성이 있는 코드들을 넣음
}catch(Exception1 e1){
// try 블럭안에서 발생한 예외를 처리하기 위한 코드 작성
}
다중 try-catch )
System.out.println(1);
int[] scores = {10,20,30};
try{
System.out.println(scores[3]); // 예외가 발생하는 코드
System.out.println(2);
System.out.println(3/0); // 예외가 발생하는 코드
System.out.println(3);
}catch (ArrayIndexOutOfBoundsException e1){
System.out.println("해당 인덱스는 존재하지 않습니다!");
}catch (ArithmeticException e2){
System.out.println("0으로 무언가를 나눌수 없습니다!");
}catch (Exception e3){
System.out.println("예외발생");
}
scores [3] 인덱스 접근 시 ArrayIndexOutOfBoundsException 가 발생하면서 해당 예외를 처리할 수 있는 catch 블록을 찾아서 예외를 처리한다. (예외를 처리를 끝마치고 나면 try 구문안에 예외가 발생한 코드의 다음 코드를 실행하는 게 아니라 try-catch 구문은 종료되면서 바깥의 코드를 실행한다.)
예외 우선순위)
catch (ArrayIndexOutOfBoundsException e1){
System.out.println("해당 인덱스는 존재하지 않습니다!");
}catch (ArithmeticException e2){
System.out.println("0으로 무언가를 나눌수 없습니다!");
}catch (Exception e3){
System.out.println("예외발생");
}
- Exception 예외는 ArrayIndexOutOfBoundsException 와 ArithmeticException의 부모이기 때문에 자식예외들이 먼저 처리를 한다음 맨 마지막에 처리가 될 수 있습니다.
( Exception 예외가 먼저 선언이 되고 그다음 ArrayIndexOutOfBoundsException 와 ArithmeticException 자식 예외들이 선언이 될 수 없다. -> 부모는 여러 자식 예외들을 가지고 있기 때문 )
* 서순 주의하기
- 부모 예외가 먼저 선언이 되고 해당 부모에 속한 자식 예외를 그다음에 선언할 수 없음
(부모가 먼저 예외 처리하면 자식은 손쓸 필요 없다)
사용자 정의 예외 처리 방법
사용자 정의 예외를 써야 되는 이유가 무엇일까?
실제로 프로그램 또는 어플리케이션에서 발생 할 수 있는 예외중에서 자바에서 제공하는 예외처리만으로 처리를 할 수없는 경우에는 직접 사용자 정의 예외를 만들어서 해결을 할 필요가 있다.
예시)
요구 사항 : 학생이라는 클래스가 있고 studentNum 과 name 이라는 멤버변수가 존재한다.
여기서 한개의 학급에 학생번호(studentNum)는 1~20번까지만 존재 할 수 있다고 한다.
만약에 학생번호가 20번을 초과해서 들어오게 되면 어떤 Exception을 작성해야 될까??
코드)
추가적인 것들)
자원(resource) 이란?
: 보통 자원이라고 하면은 운영체제의 자원(DB,파일,네트워크)을 뜻하며 필요할때 메모리에 올려서 사용을 한 후
더이상 사용되지 않으면 자원을 반납하는 식으로 운용된다.
(자바에서는 사용하지 않는 자원은 .close() 메서드를 통해 반납 처리를 한다.)
'프로그래밍 언어' 카테고리의 다른 글
쓰레드 (0) | 2021.03.04 |
---|---|
타입 지정시 연산 속도 (0) | 2021.02.26 |
디버거 사용하기 (0) | 2021.02.21 |
자바 2주차 스터디 (0) | 2021.02.18 |
자바 1주차 스터디 (0) | 2021.02.16 |