JAVA

예외 처리

yujin0517 2021. 7. 13. 23:25

예외(Exception)

-> 문법적으로는 맞지만 작동이 이상하거나 결과에 악영향을 미칠 수 있는 실행에서 발생한 오류를 예외라고 함.

예를 들어, 정수를 0으로 나누는 경우

int div1 = 5;
int div2 = 0;
System.out.println("나누기 결과: " + div1 / div2); //값을 0으로 나눌 수 없기 때문에 예외 발생.

 

예외 처리 코드 

try {
	//예외가 발생할 가능성이 있는 실행문
}
catch (처리할 예외 타입 e) {
	//예외 처리문 
}
finally {
	//예외 발생 여부와 상관없이 실행되는 문장
}

 

//다중 catch도 가능함.
try {
	//예외가 발생할 가능성이 있는 실행문
} catch (처리할 예외 타입 e) {
	//예외 처리문1
} catch (처리할 예외 타입 e) {
	//예외 처리문2 
}

 

* 주의 

-> 다중 캐치 사용 시, 더 넓은 범위의 예외 클래스일수록 마지막 catch문에 사용해야 함. 만약 넓은 범위의 예외 클래스가 첫 번째 catch문에 사용되면 그다음 catch문은 쓸 필요가 없게 됨. 

try {
	//예외가 발생할 가능성이 있는 실행문
} catch (NullPointerException e) {
	//예외 처리1
} catch (Exception e) {
	//예외 처리2
} //이런 순서로 사용해야 함.

 

연습문제 

public class ExceptionEx {
	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4, 5 };  //크기가 5인 배열 생성

		for (int i = 0; i < 10; i++) {  
			System.out.println(arr[i]);  //배열을 0부터 9까지 출력하라는 반복문 
		}
	}
}

예외 발생

--> 범위를 벗어났기에 예외처리가 필요함. 

 

- try - catch문 사용하여 예외 처리 

public class ExceptionEx {
	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4, 5 };

		try {
			for (int i = 0; i < 10; i++) {
				System.out.println(arr[i]);
			}
		} catch (Exception e) {
			System.out.println("예외 처리 발생!");
			System.out.println(e);
		}
	}
}

예외 처리 완료

 

예외 클래스

예외 클래스 예외 발생 경우 패키지
ArithmeticException 정수를 0으로 나눌 때 발생 java.lang
NullPotnterException null 레퍼런스를 참조할 때 발생 java.lang
ClassCastException 변환할 수 없는 타입으로 객체를 변환할 때 발생 java.lang
IOException 입출력 동작 실패 시 발생 java.io
NumberFormatException 일치하지 않는 타입의 숫자로 문자열을 변환할 때 발생 java.lang
InputMismatchException Scanner 클래스로 정수를 입력 받고자 했지만, 문자를 입력한 경우 발생 java.util

 

예외 떠넘기기 (throws)

-> 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠 넘기는 역할을 함. 

 

연습문제 

- 예외 발생

public class ThrowsEx {
	public static void main(String[] args) {
		int n1 = 10;
		int n2 = 0;
		
		System.out.println(n1/n2);
	}
}

예외 발생

 

- try-catch문으로 예외 처리 해결

public class ThrowsEx {
	public static void main(String[] args) {
		int n1 = 10;
		int n2 = 0;
		try {
			System.out.println(n1/n2);
		} catch (ArithmeticException e) {
			System.out.println("0으로 나눌 수 없습니다.");
		}
	}
}

예외 처리

 

- throws 사용하여 예외 처리할 메소드 정하기

public class ThrowsEx {
	public static void divEx(int x, int y) throws ArithmeticException {
		System.out.println(x/y);
	}
	public static void main(String[] args) {
		int n1 = 10;
		int n2 = 0;
		
		try {
			divEx(n1, n2);
		} catch (ArithmeticException e) {
			System.out.println("0으로 나눌 수 없습니다.");
		}
	}

}

try-catch문과 결과는 똑같음

 

* printStackTrace() : 예외 발생 코드를 추적하여 내용을 모두 콘솔에 출력, 프로그램 테스트에서 오류를 찾을 때 유용.

try {
	divEx(n1, n2);
} catch (ArithmeticException e) {
	System.out.println("0으로 나눌 수 없습니다.");
    e.printStackTrace();
}

코드를 추적하여 콘솔창에 출력

 

감사합니다!

 

2021.07.13