예외(Exception)란?
프로그래밍을 하다보면 어떠한 원인으로 인해 오류가 발생하며 프로그램이 종료되는 상황이 많이 발생하는데
이러한 오류에는 컴파일 오류와 런타임 오류가 존재한다.
컴파일 오류에 경우 빠르게 해결할 수 있지만 런타임 오류는 실행되기 전까지는 오류가 발생하는지 모르기 때문에 오류잡기가 힘든데 이러한 런타임오류는 두가지 종류가 존재하는데 에러(Error)와 예외(Exception)이다.
에러는 코드로 복구할 수 없는 오류를 뜻하며 예외는 개발자가 예측하여 막을수 있는 처리가능한 오류라고 보면된다
예외(정상적이지 않은) Case
- 0으로 나누기
- 배열의 인덱스를 초과
- 없는 파일 열기
...
int a = 1 / 0;
0으로 나누는 코드를 실행 했을 때 볼 수 있는 에러메세지 인데 ArithmeticException 이라는 문장을 볼 수 있다.
예외 처리(Exception Handling)
정상적이지 않은 Case에 대한 적절한 처리 방법을 말하며 개발자가 예측하여 미리 막아둘 수 있는 방법을 말한다.
예외처리의 형식
try {
...
} catch (예외 case1) {
...
} catch (예외 case2) {
...
}
try이 내부에서 예외가 발생할 수 있는 내용을 작성하면 catch 부분에서 그 예외처리 부분이 걸려서 catch부분의 코드가 실행이된다. 아래 예시코드를 보면서 이해하면 좀더 쉽게 이해가 가능하다.
int a = 0;
try {
a = 5/0;
} catch (ArithmeticException 변수명) {
System.out.println(변수명);
}
finally
try문에서 예외 발생 여부와 관계없이 항상 실행되는 부분을 말한다.
try {
예외가 발생할 수도 있는 부분;
} catch (예외 case1) {
예외 case1이 발생해야 실행되는 부분;
} finally {
항상 실행되는 부분;
}
try에서 예외가 발생하든 안하든 실행하는 부분이 finally 이다.
throw, throws
throw : 예외를 발생 시킴(예외를 강제적으로 발생시키는 부분을 말함)
...함수이름 () {
throw new Exception();
}
throws : 예외를 전가 시킴()
...함수이름() throws Exception {
...
}
만약에 함수 내부에서 예외가 발생했을 경우에 내부에서 처리해주어도 되지만 함수 외부로 전가되는 것을 말한다.
그러면 함수를 호출한 쪽에서 예외를 처리할 수 있도록 만들어주는것이 trows 이다.
실습해보기!
다음과 같이 5를 0으로 나누는 코드를 실행시키면
콘솔에 보이는 것처럼 에러메세지가 발생하는데 이를 예외처리 방식대로 실습해보았다.
try 에서 0으로 나누는 예외가 발생했고 그로인해 ArithmeticException 이 발생했는데 catch문에서 감지되어 "0으로 나누기 예외 발생"이 출력이되고 변수를 받아서 같이 출력하면
위와 같은 출력문이 출력되는걸 확인할 수 있다.
try catch 문에서 finally도 같이 사용해 봤는데
예외가 발생하는것과 상관없이 필수로 실행이되는 모습또한 확인할 수 있었다.
다음은 배열 인덱스를 초과 하는 예외처리방법에 대해 실습했다.
다음 코드를 실행했을 때 오류메세지가 뜨는 것을 볼 수 있는데 이는 배열의 사이즈를 4개로 만들었을때 배열 b[4]를 의미하는 것은 인덱스를 시작하는 첫 자리가 0부터 시작하기 때문에 0,1,2,3,4 이렇게 다섯번째 자리에 1을 할당한다는 의미 이지만 지금 만든 배열은 인덱스로 표현하면 0,1,2,3 이기 때문에 4는 존재할 수 없다 그러므로 에러가 발생하는 것이다.
이 에러또한 예외처리로 만들어 보면
try catch 문으로 예외가 발생하는 상황을 작성하고 예외가 발생한다면 ArrayIndexOutOfBoundsException 으로 받아서 출력해주는 코드를 작성해서 처리해 주었다.
다음은 없는 파일 열기에 대한 예외처리이다.

다음 코드를 실행했을 경우 보이는 것처럼 오류메세지가 뜨는데 이것도 마찬가지로 try catch문으로 예외처리를 해주면 된다.
'백엔드 > JAVA' 카테고리의 다른 글
JAVA 람다식 (0) | 2023.03.29 |
---|---|
JAVA 컬렉션 프레임워크 (0) | 2023.03.28 |
JAVA 입출력 #2 (0) | 2023.03.26 |
JAVA 내부 클래스 (0) | 2023.03.23 |
JAVA 인터페이스 (0) | 2023.03.22 |
댓글