25.02.27 (목) 14일차 Java

허배령·2025년 2월 27일

괴발개발 TIL

목록 보기
14/54

프로그램 오류

  • 치명적 상황이 발생하여 비정상 종료 상황이 발생한 것 (프로그램 에러)

오류의 종류

  1. 컴파일 에러 : 프로그램의 실행을 막는 소스 코드상의 문법 에러. 소스 코드 수정으로 해결
    ex) 이클립스에서 빨간 줄 뜨는 거, 개발자가 코드를 잘못 쓴 경우
int a = 99.9; => int a = (int)99.9; // 코드 수정 가능!
  1. 런타임 에러 : 프로그램 실행 중 발생하는 에러, 주로 if문 사용으로 에러 처리
    ex) 배열의 인덱스 범위를 벗어났거나, 계산식의 오류, 다운캐스팅 instanceof를 if문으로 처리
int[] arr = new int[3]; // 길이 3 : 인덱스가 0, 1, 2 까지

		arr[0] = 10;
		arr[1] = 20;
		arr[2] = 30;
		arr[3] = 40;
		// java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
		// 배열 범위 초과 예외
		
		if(3 >= arr.length) { // 배열 인덱스 범위 초과한 값이 들어왔다면
			System.out.println("배열 범위를 초과했습니다");
		} else {
			arr[3] = 40;
			System.out.println("배열 범위 안정적..");
		}
	}
}
  1. 시스템 에러 : 컴퓨터 오작동으로 인한 에러, 소스 코드 수정으로 해결 불가

오류 해결 방법

  • 소스 코드 수정으로 해결 가능한 에러를 예외(Exception)라고 하는데
    이러한 예외 상황(예측 가능한 에러) 구문을 처리하는 방법예외 처리를 통해 해결

예외 확인

  • 1) Unchecked Exception : 선택적으로 예외 처리 (ex. Runtime Exception)
  • 2) Checked Exception : 필수적으로 예외 처리 (ex. IOException, 나머지..)

Exception 확인하기

  • Java API Document에서 해당 클래스에 대한 생성자나 메소드를 검색하면
    그 메소드가 어떤 Exception을 발생시킬 가능성이 있는지 확인 가능.
    -> 발생하는 예외를 미리 확인하여 상황에 따른 예외 처리 코드를 작성할 수 있음

예시

예외 클래스 계층구조

  • Exception과 Error 클래스 모두 Object 클래스의 자손이며 모든 예외의 최고 조상은 Exception 클래스
    반드시 예외 처리해야 하는 Checked Exception과
    해주지 않아도 되는 Unchecked Exception으로 나뉨

Unchecked Exception

RuntimeException 클래스

  • 주로 프로그래머의 부주의로 인한 오류인 경우가 많기 때문에
    예외 처리 보다는 코드를 수정해야 하는 경우가 많음

RuntimeException 후손 클래스

  • ArithmeticException
    0으로 나누는 경우 발생
    if문으로 나누는 수가 0인지 검사

  • NullPointerException
    Null인 참조 변수로 객체 멤버 참조 시도 시 발생
    객체 사용 전에 참조 변수가 null인지 확인

  • NegativeArraySizeException
    배열 크기를 음수로 지정한 경우 발생
    배열 크기를 0보다 크게 지정해야 함

  • ArrayIndexOutOfBoundsException
    배열의 index범위를 넘어서 참조하는 경우
    배열명.length를 사용하여 배열의 범위 확인

  • ClassCastException
    Cast연산자 사용 시 타입 오류
    instanceof 연산자로 객체타입 확인 후 cast연산

  • InputMismatchException
    Scanner를 사용하여 데이터 입력 시
    입력 받는 자료형이 불일치할 경우 발생

예외 처리 방법

1. Exception이 발생한 곳에서 직접 처리

ex)
try{
	// 예외가 발생할 가능성이 있는 코드
    } catch(IndexArrayOutOf..Exception e) {
    	e.printStackTrace();
        처리하고 싶은 내용..
    } finally {
    	// 예외 발생 여부와 관계없이 마지막에 반드시 수행해야 하는 코드 작성
    }
  • try : Exception 발생(throw)할 가능성이 있는 코드를 안에 기술

  • catch : try 구문에서 Exception 발생 시(throw) 해당하는 Exception에 대한 처리 기술
    여러 개의 Exception 처리가 가능하나 Exception간의 상속 관계 고려해야 함

  • finally : Exception 발생 여부와 관계없이 꼭 처리해야 하는 로직 기술
    중간에 return문을 만나도 finally구문은 실행되지만
    System.exit();를 만나면 무조건 프로그램 종료
    주로 java.io나 java.sql 패키지의 메소드 처리 시 이용

    * sc.close();로 통로를 닫아 메모리 누수를 방지한다

try ~ catch로 예외 처리

public void method() {
BufferedReader br = null;

	try {
		br = new BufferedReader(new InputStreamReader(System.in));

		System.out.print("입력 : ");

		String str = br.readLine();

		System.out.println("입력된 문자열 : " + str);
	} catch (IOException e) {
		e.printStackTrace();
	}
}

try ~ catch ~ finally로 예외 처리 후 반드시 수행해야 하는 로직 처리

public void method() {
	BufferedReader br = null;

	try {
		br = new BufferedReader(new InputStreamReader(System.in));
		System.out.print("입력 : ");
		String str = br.readLine();
		System.out.println("입력된 문자열 : " + str);
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		try {	// finally 안에 try ~ catch가 또 중복
			System.out.println("BufferedReader 반환");
			br.close();	// 스캐너 통로 닫기 : 메모리 누수 방지
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

2. Exception 처리를 호출한 메서드에게 위임

  • 메서드 선언 시 throws Exception명을 추가하여 호출한 상위 메서드에게 처리 위임
  • 계속 위임하면 main() 메서드까지 위임하게 되고
    main() 메서드에서도 처리되지 않는 경우 프로그램이 비정상 종료됨

throw : 예외 강제 발생 구문
throws : 호출한 메서드에게 예외를 위임(던짐)

throws로 예외 던지기

public void ex4() {
		
		try {
			methodA();
			
		} catch(IOException e) {
			// IOException의 부모인 Exception도 가능
			System.out.println("methodC에서부터 발생한 예외를 ex4에서 잡아서 처리함");
		}
		
	}
	
	public void methodA() throws IOException {
		
		methodB();
	}
	
	public void methodB() throws IOException {
		
		methodC();
	}
	
	public void methodC() throws IOException {
		// throws : 호출한 메서드에게 예외를 던짐
		// -> 호출한 메서드에게 예외처리를 하라고 위임하는 행위
		
		// throw : 예외 강제 발생 구문
		throw new IOException();	// Checked Exception이라
									// 반드시 처리해야해서 빨간줄뜸
	}

Exception과 오버라이딩

  • throws를 받는 대상이 같거나 부모여야 함 (후손 -> 부모)

사용자 정의 예외

  • Java API에서 제공하는 Exception Class 만으로는 처리할 수 없는 예외가 있을 경우
    사용자의 필요에 의해 생성하는 Exception Class.
    Exception 발생하는 곳에서 throw new 예외클래스명()으로 발생

ExceptionService 클래스

public void ex5() throws UserException {
		// 사용자 정의 예외 클래스인 UserException 사용하여 강제 예외 발생시키기
		throw new UserException("사용자정의 예외 발생");
	}
    
    		↓↓↓↓던져서↓↓↓↓

UserException 클래스 (사용자 정의 클래스)

// 사용자 정의 예외 클래스
public class UserException extends Exception{

	public UserException() {}

	public UserException(String message) {
		super(message);
	}
    
    		↓↓↓↓    ↓↓↓↓

Run 클래스

public class ExceptionRun {

	public static void main(String[] args) {
		
		try {
			new ExceptionService().ex5();
			
		} catch (UserException e) {
			
			System.out.println(e.getMessage());
		} 
	}
}


profile
인생은 변수

0개의 댓글