컴파일 오류
- 프로그램 코드 작성 중 실수로 발생
실행 오류
- 실행중인 프로그램이 의도하지 않은 동작을 하거나 프로그램이 중지함
버그(bug)
- 실행 오류 중 프로그램을 잘못 구현하여 의도한 바와 다르게 실행되어 생기는 오류
로그(log)
- 소프트웨어 실행 중에 발생하는 여러 상황을 기록한 내용
- 오류가 발생했을 때 로그를 보고 오류가 발생한 코드를 순서대로 따라가며 확인할 수 있고 원인을 찾을 수 있다.
- 예외 처리시 로그를 잘 남기기 위해 습관하는 것은 중요하다.
예외처리 목적
- 프로그램이 비정상적으로 종료되는 것을 방지
시스템 오류
- 자바 가상 머신에서 발생
- 프로그램으로 제어 불가능
- 오류 클래스는 모두 Throwable 클래스에서 상속 받음
- Error 클래스의 하위 클래스는 시스템에서 발생하는 오류를 다루며 프로그램에서 제어하지 않음
- 프로그램에서 제어하는 부분은 Exception 클래스와 그 하위에 있는 예외 클래스
예외처리
- 프로그램에서 제어 가능
- 예외 클래스의 최상위 클래스는 Exeption 클래스
- 컴파일러에 의해 체크되지 않는 예외는 프로그래머가 알아서 처리해야 하므로 주의해야 한다.
try - catch 문
rty{
// 예외가 발생할 수 있는 코드 부분
} catch (처리할 예외 타입 e){
// try 블록 안에서 예외가 발생시 예외를 처리하는 부분
}
- 예외를 처리하는 가장 기본 문법
- catch문의 괄호 ( ) 안에 쓰는 에러타입은 예외상황에 따라 달라짐
package exception;
public class ArratExceptionHandling {
public static void main(String[] args) {
int[] arr = new int[5];
try {
for(int i = 0; i <= 5; i++) {
arr[i] = i;
System.out.println(arr[i]);
}
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println(e);
System.out.println("예외 처리 부분");
}
System.out.println("프로그램 종료");
}
}
0
1
2
3
4
java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5
예외 처리 부분
프로그램 종료
- 예외 처리한다고 해서 예외상황 자체를 막을 수는 없다.
- 예외 처리를 하면 예외 상황을 알려주는 메세지를 볼 수 있고, 프로그램이 비정상 종료되지 않고 계속 수행하도록 할 수 있다.
printStackTrace( ) 메서드
- 어디에서 예외가 발생했는지 따라가는 메서드 (위치 추적)
리소스
- 시스템에서 사용하는 자원
try - catch - finally 문
try{
에러가 발생할 수 있는 코드 부분
} catch(처리할 예외 타입 e){
예외를 처리하는 부분
} finally {
항상 수행되는 부분
}
- try 블록이 수행되면 finally 블록은 무조건 수행해야 함
- ex) catch문에 return문이 있어도 수행됨
package exception;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class ExceptionHandling3 {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("a.txt");
} catch (FileNotFoundException e) {
System.out.println(e);
return; //return문이 있어도finally문 수행
}finally {
if(fis != null) {
try {
fis.close(); //파일 입력 스트림 닫기
} catch(IOException e) {
e.printStackTrace();
}
}
System.out.println("항상 수행됩니다.");
}
System.out.println("여기도 수행됩니다.");
}
}
try - catch - resources 문
try(A a = new A(); B b = new B()){
...
} catch(Exception e){
...
}
- close( ) 메서드를 명시적으로 호출하지 않아도 try 블록 내에서 열린 리소스를 자동으로 닫도록 만들 수 있다.
- 해당 문법 사용시 해당 리소스가 AutoCloseable 인터페이스를 구현해야 한다.
package exception;
public class AutoCloseObj implements AutoCloseable{
@Override
public void close() throws Exception{
System.out.println("리소스가 close() 되었습니다.");
}
}
AutoCloseable 인터페이스
- 반드시 close( ) 메서드를 구현해 주어야함
throw new Exception( )
- 해당 문장을 사용하면 강제로 예외를 발생시켜 catch블록이 수행되도록 구현할 수 있다.
향상된 try - catch - resources 문
- 리소스가 외부에 선언되고 생성된 경우에도 다른 참조 변수로 괄호안에 다시 선언해야 했다.
- 하지만, 자바 9 부터는 다음 처럼 try문의 괄호 안에서 외부에서 선언한 변수를 사용 할 수 있다.
throws
- 예외처리를 미룸
- Add throws declaration은 main( ) 함수 선언 부분에 throws FileNotFoundException, ClassNotFoundException을 추가하고 예외처리를 미룬다는 뜻
- main( ) 함수에서 미룬 예외 처리는 main( ) 함수를 호출하는 자바 가상 머신으로 보내짐
즉, 예외를 처리하는 것이 아니라 대부분의 프로그램이 비정상 종료됨 - 따라서 밑에 두 옵션 중 하나를 사용하는 것이 좋다.
- ex) 여러 예외를 한문장으로 처리
- ex) 각 예외 상황마다 다른 방식으로 처리
다중 에외 처리
- 문법적으로 반드시 예외처리를 해야하는 경우 이외에도 예외 처리를 해야할 때 사용
- 어떤 예외가 발생할지 미리 알 수 없지만 모든 예외상황을 처리하고자 할 때 사용
- 맨 마지막 부분에 Exception 클래스를 활용하여 catch블록을 추가
** 다중 예외 처리시 주의 사항 **
- 예외 catch문은 선언 순서대로 검사를 진행한다.
- 맨 위에 catch(Exception e) 문장을 쓰면 발생하는 모든 클래스는 Exception 상위 클래스로 자동 형 변환되어 오류 발생
- 따라서 catch(Exception e) 문장은 가장 아래에 위치해야 한다.
사용자 정의 예외
- 예외 클래스를 직접 만들어 예외 조건을 직접 정의
- 구현시 기존 JDK에서 제공하는 예외 클래스 중 가장 유사한 클래스를 상속 받는 것이 좋다.
- 유사한 예외 클래스를 모르겠다면 Exception 클래스를 상속해도 괜찮다.
아이디는 null일 수 없습니다.
아이디는 9자 이상 20자 이하로 쓰세요
728x90
반응형
'Language > Java' 카테고리의 다른 글
멀티캠퍼스 7일차 (0) | 2022.10.19 |
---|---|
멀티캠퍼스 6일차 (0) | 2022.10.19 |
'Do it 자바프로그래밍 입문' 13장 정리 (0) | 2022.10.05 |
'Do it 자바프로그래밍 입문' 12장 정리 (2) | 2022.09.30 |
'Do it 자바프로그래밍 입문' 11장 정리 (0) | 2022.09.27 |
댓글