자바프로그래밍

[JAVA] 예외처리

제주도소년 2020. 4. 29. 16:16

[ 예외처리 ]

- 예외(Exception)가 발생했을 때 어떻게 할 것인지에 대해 명시해 주는 것

- 예외처리 방법에는 2가지가 있다. 하나는 try - catch 를 사용하여 예외상황을 직접 처리하는 것과, throws 를 사용하여 예외처리 책임을 호출한 쪽으로 전가하는 것

 

[ try - catch - finally ]

public static void main(String[] args) {
	Human man = null
    try {
    	man.getAge(); // NullPointerException
    } catch(NullPointerException e) {
    	/*
        	예외가 발생했을 때 그 예외가 NullPointerException 이라면
        	어떻게 할 것인지 명시 한다.
        */
        System.out.println("예외 발생");
    } finally {
    	/*
        	finally 는 예외 발생 여부와 관계없이 수행된다.
            즉, 실행을 보장한다. finally 는 사용해도 되고 안해도 된다.
        */
        System.out.println("Bye Bye");
    }
}

 

catch 를 여러 개 선언하여 사용할 수 있으나 상위 객체가 먼저 오면 컴파일 에러가 발생한다

다라서 반드시 하위 예외부터 사용해야 한다.

public static void main(String[] args) {
	try {
    
    } catch(RuntimeException e) {
    
    } catch(ArrayIndexOutOfBoundsException e) {
    
    }
}

JDK 1.7 이후에서 추가된 것

public static void makeException(int[] arr) {
	try {
    	System.out.println(arr[10]);
        //JDK 1.7 이후부터
        //여러 예외들에 대해 동일한 작업을 수행하는 경우 아래와 같이 사용 가능
	} catch(NullPointerException | ArrayIndexOutOfBoundsException e) {
    	System.out.println("예외 발생 : " + e.toString());
    }
}

[ throws ]

현재 단계에서 예외처리를 정의 내릴 수 없는 경우

import java.io.*;
class ExceptionEx1 {

	public static void first() throws FileNotFoundException {
			second();
	}
    //FileNotFoundException 에 대해서 throws 를 사용하여 책임을 전가함.
	public static void second() throws FileNotFoundException {
		FileReader fr = new FileReader("a.txt");
	}
	/*
	//문법적으로 문제는 없으나 이런 코드는 없음
	public static void main(String[] args) throws FileNotFoundException {
		first();
	}
	*/
	public static void main(String[] args) {
    	//따라서 여기서 직접 예외처리
		try {
			first();
		} catch(FileNotFoundException e) {
			System.out.println("예외를 처리 하시오");
		}
	}
}

throws 를 쓰는 방법

class MyLib {
	public static void todo() {
		try {
			//예외발생
			new FileReader("a. txt");
		} catch(FileNotFoundException e) {
			//여기서 예외를 처리하면 Foo, Bar 는 예외에 대해서
			//알 방법이 없음... (동작 했는지 안 했는지에 대한 여부)
			/*
				throws 를 사용하면 Foo 나 Bar 에서 예외처리를 할 수 있고
				각 클래스마다 다르게 할 수 있음
			*/
		}
	}
}

class Foo {
	public void call() {
		MyLib.todo();
	}
}

class Bar {
	public void call() {
		MyLib.todo();
	}
}

if 문에서 break; 를 사용하지 않고 예외처리를 이용하는 방법..

public static void main(String[] args)	{
		try {
			int num = 0;
			while(true) {
				num++;
				if(num == 100) {
                	//예외 객체를 선언하고
                    //throw 를 사용하면 예외를 직접 발생시키는게 됨
					throw new Exception();
				}
			}
		} catch(Exception e) {
			System.out.println("end");
		}
	}

직접 예외 클래스를 생성하여 처리하는 방법

class TooLongArraySizeException extends Exception {
	public TooLongArraySizeException() {
		super("3개를 초과할 수 없습니다.");
	}
	
	public TooLongArraySizeException(int num) {
		super(num + " 개를 초과할 수 없습니다.");
	}
}
class ExceptionEx3 {
	public static void printSum(int... nums) throws TooLongArraySizeException {
		// 나는 원소가 3개를 초과하는 걸 원하지 않음
		// 3개가 넘어가면 예외로 보겠다.
		if(nums.length > 3) {
			//예외가 발생하는 상황
			//1. 예외객체 정의
			TooLongArraySizeException e = new TooLongArraySizeException();
			//2. 직접 발생
			throw e;
		} else {
			int sum = 0;
			for(int n : nums) {
				sum += n;
			}
			System.out.println(sum);
		}
	}

	public static void main(String[] args)	{

		try {
			printSum(1,2,3);
		} catch(TooLongArraySizeException e) {
			System.out.println(e.getMessage());
		}

		try {
			printSum(1,2,3,4);
		} catch(TooLongArraySizeException e) {
			System.out.println(e.getMessage());
		}
	}
}

'자바프로그래밍' 카테고리의 다른 글

파일입출력(Data : InputStream, OutputStream)  (0) 2020.06.01
파일 입출력(IO패키지)  (0) 2020.05.28
[JAVA] 로또 프로그램(컬렉션 사용)  (0) 2020.04.26
List  (0) 2020.04.23
컬렉션  (0) 2020.04.23