티스토리 뷰

JAVA/JAVA Theory

[JAVA] 16. Exception

쟌쥰 2019. 11. 17. 18:40

1. 예외 (Exception) ?

프로그래밍 오류(에러)는 발생 시점에 따라 컴파일타임 에러, 런타임 에러, 시스템 에러 세가지로 구분할 수 있다.

  • 컴파일 에러 :
    • 소스 컴파일 시에 발생하며. 주로 문법적인 에러이다.
    • 에러가 발생된 소스 코드를 수정하여야 한다.
  • 런타임 에러 :
    • 프로그램 실행 도중에 발생하며, 잘못된 값의 입력 등 수행할 수 없는 작업을 시도할 경우에 발생한다.
    • 소스코드로 에러 발생 구문을 수정하여야 한다.
  • 시스템 에러 :
    • 컴퓨터 시스템 상에 발생하는 오동작에 의한 에러로 정정, 메모리 부족 등 소스 코드로는 해결할 수 없는 장비 또는 운영체제 관련 에러이다.
    • 소스 코드 수정으로는 해결할 수 없다.

자바는 런타임 에러를 error 와 exception 으로 구분한다.

에러는 프로그램 소스로 해결할 수 없는 경우를 말하며 복구할 수 없는 심각한 경우이다.

예외는 소스 코드로 해결할 수 있는 에러를 말하며 발생하더라도 해결할 수 있다.

자바는 예외는 크게 두가지로 구분하였는데, RuntimeException이나 그 후손들은 Unchecked Exception 이라 하여 소스 코드상에서 처리하지 않아도 되는 예외로, 그 외의 예외들을 Checked Exception 이라 하여 반드시 소스 코드로 예외 처리(Exception Handling)를 해주어야 하는 예외로 구분해 두었다.

 

2. 예외 처리 (Exception Handling) 구문

예외 처리 구문은 크게 세 가지가 제공되며, 예외를 직접 처리할 때 사용하는 try ~ catch ~ finally 구문, 예외를 이전 호출 위치로 넘기는 throws 구문, 자동으로 close 처리를 해주는 try with resource 문이 있다.

예외가 발생되면 프로그램은 비정상적으로 종료하게 된다. 만약, 프로그램이 종료되지 않고 실행의 흐름을 바꾸고자 한다면 try ~ catch 문으로 직접 예외를 처리해 주면 된다.

try ~ catch 문 맨 마지막에 사용되는 finally 구문은 예외가 발생하든 발생하지 않든 무조건 구동되어야 하는 코드를 작성하는 영역이다.

try {

	// 예외 발생 가능성이 있거나, 예외를 반드시 처리해야 하는 코드 작성부
    
} catch (처리할 예외클래스명 객체1) {

	// 예외 상황 1에 대한 처리 코드
    
} catch (처리할 예외클래스명 객체2) {

	// 예외 상황 2에 대한 처리 코드
    
} finally {

	// 예외 발생으로 try {} 안의 코드가 중단되더라도 반드시 실행해야 하는 코드
    
}

하나 이상의 catch 문을 사용할 경우에는 반드시 처리할 예외클래스들의 상속관계를 고려하여 최하위 후손 클래스부터 기술해 주어야 한다.

발생한 예외에 대한 정보를 확인하려면 에러 객체를 직접 출력하거나(예외객체.toString()) 메시지를 출력하거나 (예외객체.getMessage()) 또는 실행 흐름상의 예외 발생 단계를 추적하여 출력하는 (예외객체.printStackTrace()) 코드를 추가할 수도 있다.

 

다음 코드를 통해 간단한 예외처리 구분 사용법을 살펴보겠다.

package com.test01;

import java.util.InputMismatchException;
import java.util.Scanner;

public class MyCalc {

	public int inputNum() {
		int n = 0;

		System.out.println("숫자만 입력하세요 : ");
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();

		return n;
	}

	public int calculation() {
		int res = 0;

		while (true) {
			try {
				res = inputNum() / inputNum();
				String a = "1ㄶ0";
				int i = Integer.parseInt(a);
				System.out.println(res);
				break;
			} catch (InputMismatchException e) {
				System.out.println("숫자 입력 에러");
				// e.printStackTrace(); //console 창에 나오는 에러메시지 를 의미한다.
			} catch (NumberFormatException e) {
				System.out.println("숫자 변환 에러");
				e.printStackTrace();
			} finally {
				//finally 는 에러가 나든 안나든 무조건 실행된다!!!
				System.out.println("------------------------------------------------");
			}
		}
		return res;
	}
}

main()

package com.test01;

public class MTest {

	public static void main(String[] args) {
		MyCalc my = new MyCalc();
		my.calculation();
	}
}

 

3. 예외 처리 미루기 (throws)

이 방법을 사용하면 해당 메소드 안에서 발생한 예외 처리에 대한 책임을 메소드를 호출한 쪽으로 떠넘길수 있다. 컴파일 시에는 문제가 없지만 예외 발생 시에 호출하는 코드에서 예외를 처리하지 못 한다면 프로그램은 비정상 종료를 하게 된다. 호출하는 입장에서 선언된 예외를 보고 발생할 수 있는 예외를 미리 파악할 수 있고 또한 반드시 처리해야 하므로 프로그램을 견고하게 한다.

 

4. 예외 던지기 (thorw)

원하는 조건 상황에서 필요할 경우 예외 객체를 생성시키면서 예외를 발생시킬 수 있다. 자바에서 제공되는 예외 클래스이든 개발자가 만든 사용자 정의 예외 클래스든 모두 생성하고 발생시킬 수 있다.

 

5. 사용자 정의 예외클래스 만들기

자바에서 제공해 주는 예외 클래스가 사용하려는 목적에 맞지 않을 때 직접 예외 클래스를 만들어 사용할 수 있다. 사용자 정의 예외 클래스를 만들 때 java.lang.Exception 클래스를 반드시 상속받으면 된다.

 

다음 코드를 통해 사용자 정의 예외클래스를 만든 예시를 살펴보고 간단한 throw 구문도 살펴보도록 하겠다.

package com.test02;

public class MyException extends Exception {

	public MyException() {
		this("Exception Test!");
	}

	public MyException(String message) {
		super(message);
	}
}

main()

package com.test02;

import java.util.InputMismatchException;
import java.util.Scanner;

public class MTest {

	public static void main(String[] args) {
		int i = 0;

		try {
			System.out.println("숫자를 입력해 주세요 : ");
			Scanner sc = new Scanner(System.in);
			i = sc.nextInt();

			if (i == 4) {
				throw new MyException("예외 발생 연습!");
			}

		} catch (InputMismatchException e) {
			System.out.println("잘못된 입력");
		} catch (MyException e) {
			System.out.println("4 입력");
			e.printStackTrace();
		} catch (Exception e) {
			System.out.println("누군진 모르겠지만, 어쨋든 예외");
		} finally {
			System.out.println("=================================");
		}

	}
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함