예외처리(Exception)

2022. 9. 20. 02:04Java 프로그램

728x90

오늘은 예외처리(Exception)을 공부 해 보겠습니다. 사실 이 부분에서 벽을 느끼고 시간을 두고 공부했습니다.

그래도 열심히 해보면 될 것 같습니다.

우선 자바에서는 오류는 크게  2가지가 존재합니다.

1. 에러(Error)

- 정상 실행 상태로 돌아갈 수 없는 오류로 하드웨어의 동작 또는 고장으로 인한 오류 등등을 말합니다.

2. 예외(Exception)

- 사용자의 잘못된 조작 혹은 개발자의 잘못된 코딩으로 인한 오류입니다. 이 예외는 Error와 다르게 예외 처리를 수행해주는 코드를 추가하면 정상 실행 상태로 돌아갈 수 있습니다.

그렇다면 예외 종류는 무엇이 있을까요?

예외의 종류도 크게 2가지 정도가 있습니다.

1. 일반 예외

- 예외 처리 코드가 없으면 컴파일 오류가 발생합니다.

2. 실행 예외(runtime Exception)

- 예외 처리 코드를 생략하더라도 컴파일이 되긴 하는 예외 입니다.

이 실행 예외는 개발자의 경험에 따라 각각 다른 예외처리 코드 작성이 필요합니다.

예외의 관계 이미지

예외에서 유독 어려웠던 것은 RuntimeException이었습니다. 지극히 개인적으로 이것이 어려웠지만 그렇기에 이 실행예외를 중점으로 다뤄 보겠습니다.

RuntimeException

1. NullPointerException

- null값을 갖는 참조변수로 객체 접근 연산자인 .(도트)를 사용했을때 발생합니다.

 

public class NullPointerException {

	public static void main(String[] args) {
		String data = null;
		System.out.println(data.toString());

	}

}

위 코드의 실행 결과는 NullPointerException이라고 콘솔창에서 뜨는 것을 확인 할 수 있습니다.

NullPointerException 결과 확인

2. ArrayIndexOutOfBoundsException

- 배열에서 인덱스 범위를 초과하여 사용할 경우 발생합니다.

public class ArrayIndexOutOfBoundsException {

	public static void main(String[] args) {
		String[] data = new String[10];
		System.out.println(data[11]);

	}

}

위 코드처럼 data라는 String타입의 배열은 10크기 지만 정해진 인덱스를 벗어난 data[11]을 출력하려하니..

ArrayIndexOutOfBoundsException 결과 확인

이렇게 ArrayIndexOutOfBoundsException의 예외가 발생했다고 알려주는걸 확인 할 수 있습니다.

 

3. ClassCastException

-타입 변환이 되지 않을 경우 발생합니다.

public class ClassCastException {

	public static void main(String[] args) {
		Animal animal = new Dog();
		Cat cat = (Cat) animal;

	}

}

위 코드처럼 타입 변환이 되지 않는다면 아래와 같이

ClassCastException 결과 확인

ClassCastException 이 발생하는 것을 확인 할 수 있습니다.

 

이렇게 예외가 발생하면 예외처리 코드를 작성해야합니다.

예외처리 코드는 try~catch와 throws 가 일반적이라고 생각하시면 됩니다.

1. try~catch

실행 알고리즘(순서)는

예외 처리 알고리즘

try문 안에 예외가 발생할 우려가 있는 코드를 넣고 그 예외가 발생한다고 가정했을때의 처리할 코드를 catch문에 넣어 예외를 처리해주는 방법이라고 볼 수 있습니다.

ArrayIndexOutOfBoundsException를 예로 코드를 작성해 보겠습니다.

public class ArrayIndexOutOfBoundsException {

	public static void main(String[] args) {
		String[] data = new String[10];
		try {
			System.out.println(data[11]);

		}catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("인덱스를 초과하였습니다. 인덱스를 다시 조정해주세요");
		}
		
		
	}

}

ArrayIndexOutOfBoundsException 예외 처리 결과

 

이런 방식으로 try~catch문을 사용 한다면 예외처리가 발생했을때는 catch문에 있는 출력문이 실행되는 것을 확인할 수 있습니다.

2. throws 

throws는 비교적 간단한 방법이라고 생각합니다. 사실 이건 자바가 알아서 처리해주는 느낌이 없지 않아 있기 때문인데요

일단 정의는

- 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠 넘기는 역할입니다. 즉, 메소드니 main메소드도 포함이겠죠?

알고리즘을 예로 들고 마무리 하겠습니다.

throws 예외 처리

이런식으로 처리하지 않은 예외를 메소드를 호출한 곳에서 처리하게끔 넘겨주는 방식을 사용할 때 throws를 사용합니다.

예외처리와 예외는 코딩할 때 발생할 수 밖에 없는 당연한 과정이라고 생각합니다. 그렇기에 어떻게 보면 간단하지만 그렇다고 결코 가볍게 여길 문제는 아니라고 생각하기에 꼭 실습과 연습을 통해 익히는 것이 옳다고 감히 말씀 드려봅니다.

감사합니다.

 

반응형

'Java 프로그램' 카테고리의 다른 글

자바 기본 API 2편 (String Class~~  (2) 2022.09.30
자바 기본 API 1편  (0) 2022.09.30
인터페이스(interface)  (0) 2022.08.30
클래스 상속- 다형성  (0) 2022.08.30
상속 (클래스 상속)/ @Override  (0) 2022.08.30