Language/Java

'Do it 자바프로그래밍 입문' 14장 정리

ABCD 2022. 10. 6.

컴파일 오류

  • 프로그램 코드 작성 중 실수로 발생

 

실행 오류

  • 실행중인 프로그램이 의도하지 않은 동작을 하거나 프로그램이 중지함

 

버그(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 declarationmain( ) 함수 선언 부분에 throws FileNotFoundException, ClassNotFoundException을 추가하고 예외처리를 미룬다는 뜻
  • main( ) 함수에서 미룬 예외 처리는 main( ) 함수를 호출하는 자바 가상 머신으로 보내짐
    즉, 예외를 처리하는 것이 아니라 대부분의 프로그램이 비정상 종료됨
  • 따라서 밑에 두 옵션 중 하나를 사용하는 것이 좋다.
  • ex) 여러 예외를 한문장으로 처리

  • ex) 각 예외 상황마다 다른 방식으로 처리

 

다중 에외 처리

  • 문법적으로 반드시 예외처리를 해야하는 경우 이외에도 예외 처리를 해야할 때 사용

  • 어떤 예외가 발생할지 미리 알 수 없지만 모든 예외상황을 처리하고자 할 때 사용
  • 맨 마지막 부분에 Exception 클래스를 활용하여 catch블록을 추가

** 다중 예외 처리시 주의 사항 **

  • 예외 catch문은 선언 순서대로 검사를 진행한다.
  • 맨 위에 catch(Exception e) 문장을 쓰면 발생하는 모든 클래스는 Exception 상위 클래스로 자동 형 변환되어 오류 발생

  • 따라서 catch(Exception e) 문장은 가장 아래에 위치해야 한다.

 

사용자 정의 예외

  • 예외 클래스를 직접 만들어 예외 조건을 직접 정의
  • 구현시 기존 JDK에서 제공하는 예외 클래스 중 가장 유사한 클래스를 상속 받는 것이 좋다.
  • 유사한 예외 클래스를 모르겠다면 Exception 클래스를 상속해도 괜찮다.

아이디는 null일 수 없습니다.
아이디는 9자 이상 20자 이하로 쓰세요
728x90
반응형

댓글

💲 추천 글