[JAVA] 예외 처리

김윤섭·2023년 9월 4일
0

JAVA

목록 보기
24/27
post-thumbnail

(1) 에러의 종류

  • 컴파일 에러
    - 이클립스에서 빨간색으로 표시되는 경우
    - 소스코드의 구문 오류로 컴파일이 불가능
    - 프로그램을 실행하기 전에 발견됨
  • 런타임 에러
    - 구문상 에러는 없음
    - 다양한 경우의 수에 대응하지 못하면 발생
    - 런타임에러가 발생하면 프로그램은 강제로 종료
    - 프로그램 에러라고 부르는 현상은 대부분 런타임 에러

(2) 런타임 에러의 종류

  • 논리적 오류, 자바 가상 머신 자체 문제로 인한 오류, 예외가 있다.

- 논리적 오류

  • 프로그램 자체의 구조적인 문제
  • 논리적 모순이 생기지 않도록 코드 작성

- 자바 가상 머신 자체 오류

  • 프로그래머가 책임질 수 없음

- 예외 (Exception)

  • 프로그래머의 노력으로 처리할 수 있는 부분
  • 프로그램 실행중에 발생할 수 있는 예기치 않은 사건
  • 자바 가상 머신은 프로그램 중에 예외가 발생하면 예외 클래스로부터 예외객체를 생성 -> 예외 처리 구문으로 넘김
  • 구문이 자바 가상 머신에 의해 호출되면 적절한 처리를 수행해야 함

(3) JAVA의 예외처리

  • java에서 예외 발생시 프로그램 실행 시

    	- 오류난 구문 아래로 실행 안 됨
    	- 아래 화면 뜸

  • try ~ catch ~ finally 구문을 통해 예외 상황에 대응가능

    - try의 구문이 오류나면
    - catch에 설정해둔 메서드 실행
    - finally는 오류가 나도 안나도 실행

try{
    	// 기본적으로 실행되는 부분
    } catch( 예외클래스이름 객체이름 ){
    	// try 블록에서 예외가 발생한 경우
        // 이곳으로 제어가 넘어옴
    } finally {
        // 예외 발생 여부에 상관없이 무조건 실행
        // 생략 가능
    }    
 try {
        String year2 = "나이";
        int age2 = 2023 - Integer.parseInt(year2);
        System.out.println(age2); 
    } catch ( NumberFormatException e ) {   // 넘버 포맷 예외가 발생했을 때 예외에 대한 정보를 갖고 있는 파라미터 e
        System.out.println("에러가 발생했습니다.");
    } finally {
        System.out.println("----프로그램 종료----");	
    }
  • catch 블록은 에러가 예상되는 상황에 복수로 명시하는 것이 가능

(4) 예외상황 클래스의 종류

  • catch 괄호안에 사용
  • 예외처리 안하고 실행했을 때 콘솔화면에서도 확인 가능하다.
  • 추가
    - ArrayIndexOutOfBoundsException : 배열에서 인덱스 범위를 추가해서 사용할 경우 발생
    - NumberFormatException : 문자열로 되어 있는 데이터를 숫자로 변경할 때, 문자열에 숫자 외 다른 타입 문자가 있으면 발생

(5) 에러 객체 'e'

  • e.printStackTrace();

    	- 실제 예외 상황시에 출력되는 메시지를 강제로 catch에서 출력
    	- 개발자가 예외상황을 분석하기 위한 용도로 사용

  • e.getMessage()

    	- 간략한 에러 메시지를 리턴한다.

(6) Exception 클래스

  • 예외상황 클래스 종류의 최상위 클래스
  • 이 클래스 이름으로 catch 블록을 구성하면, 모든 예외상황에 일괄적으로 대응 가능
  • 상황별 개별적인 처리는 불가능
  • 맨 마지막 catch블록에 명시하여 "알 수 없는 에러"를 의미하도록 구성한다.

<< Exception 클래스 예시를 보기 위한 오류 구문 >>

	String[] src = {"8", "7", "다"} ;
		
		//src의 내용들을 숫자로 변환해서 저장할 배열
			
			int[] arr = new int[3];
		try {	
			for( int i = 0; i<src.length; i++) {
			arr[i] = Integer.parseInt(src[i]);
			}
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("데이터가 너무 많습니다.");
		} catch (Exception e) {
			System.out.println("알 수 없는 예외가 발생했습니다.");
		} finally {
			System.out.println("--데이터 변환 종료--");
		} 
		System.out.println("-----프로그램 종료합니다-----");
        
	//  catch 구문으로 배열에 관한 예외만 두었기 때문에
    //  문자열에 대한 예외 못 잡음 

결과

profile
안녕하세요

0개의 댓글