본문 바로가기
Study/Java

[Java] 에러(Error)과 예외(Exception)

by dev_kong 2022. 11. 14.
728x90
728x90

0. 목차

1. 개요

2. 오류

3. 예외

1. 개요

우테코 3주차 과제 수행 중 예외에 대한 공부의 필요성을 느끼고 책과 검색을 통해 알게된 내용을 정리해보려고 한다.
JS만 거의 1년 가까이해서 뭔가 굉장히 낯선 부분인데,


우테코 슬랙채널을 보면 다른 언어를 하시던 분들도 다 비슷한 마음 인것 같다..

 

나두!

현재 공부하는 책에서 예외처리에 대한 챕터를 딱하고 펼치니,
오류와 예외는 다릅니다. 라는 사실 부터 짚고 넘어간다.

 

일단 오류나 예외나 모두 클래스로 관리되고,둘 다 Throwable을 상속하기 때문에,
에.. 비슷한거 아닌가 싶은 느낌인데,
다르다니까 뭐가 다른지 확인을 해보자.

 

2. 오류

우선 오류는 시스템이 종료되어야 할 수준의 상황과 같이 수습할 수 없는 심각한 문제를 의미한다.

오류

이는 개발자가 예측이 불가능하고, 에측이 불가능하니 방지도 불가능하다.
뭐.. 기도메타가 답인건가..

예를 들자면 StackOverFlowError || OutOfMemoryError 이 있다.

3. 예외

저 위에 저 기도메타로 해결해야 되는건 어쩔 수 없다 치고,

기도메타(엔-터)

예외에 대해 알아보자.

 

예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류이다.
예외가 발생되면 프로그램이 곧바로 종료된다는 점에서는 에러와 비슷하다.

 

Java에서는 예외를 클래스로 관리하는데 모든 예외는 java.lang.Exception을 상속 받는다.

엄청나게 많은 예외의 종류가 있지만, 크게 두가지로 나뉘어 진다.


일반 예외실행 예외가 그것이다.

3-1. 일반 예외

일반예외는 컴파일러 체크 예외라고도 불린다.


이름에서도 느낌이 빡온다.
컴파일러가 체크를 해주는 예외구나..

 

똑똑한 컴파일러님께서 예외가 발생할 가능성이 높은 애들이 있는지 먼저 검사를 해본다.
예외가 발생할 가능성이 높은 애들이 발견하게 되면, 이 친구들을 처리해주는 코드 즉, 예외처리에 대한 코드가 있는지 확인을 해본다.
만약 예외처리 코드가 발견되지 않는다면, 컴파일 오류가 난다.

 

즉, 일반 예외의 경우에는 위대하신 컴파일러 님 덕분에 예외처리를 깜빡하고 놓칠일이 없다는 뜻이다.
너무 고맙다...

 

일반예외의 예시로는
ClassNotFoundException 또는 InterruptedException 등등 이있다.

3-2. 실행 예외

실행 예외는 컴파일러 넌(none)체크 예외 라고도 불린다.
..ㅎㅎ 이름부터 아주 날 고생시킬것 같은 친구다 ㅎㅎ

 

 

일반 예외와 실행예외의 가창 큰 차이점은
RuntimeException의 하위 클래스이냐 아니냐이다.

 

실행 예외는 RuntimeException 의 하위 클래스이다. 즉 클래스 상속 관계에서 부보에 RuntimeException이 있다면, 실행 예외 클래스이다.

위 그림을 보면 좀 이해가 잘 될지도모르겠다.


저기 저저 RuntimeException의 모든 하위 클래스는 실행예외의 클래스들이다.

 

위와같은 실행 예외 같은 경우는 컴파일러가 체크를 해주지 않고,
개발자의 경험에 의해 예외처리를 해주어야 한다.


그렇기 때문에 자주 발생되는 실행예외 몇가지를 알아보자.

NullPointerException

가장 빈번하게 발생하는 친구다. 나도 몇번 만나봤다. 이 친구 가까이 안지내는게 좋을 것 같더라.


대충 이름만 봐도 느낌이 온다.
값이 null 인 변수에다가 method를 호출하려 한다던가, 프로퍼티에 접근하려고 할때 발생하는 예외이다.

 

String str = null;
System.out.println(str.toString());

 

위의 코드를 실행시키면 만날 수 있다.

 

 

ArrayIndexOutOfBoundsException

아 이친구도 이름만 봐도 느낌이 온다.
사실 이친구가 날 제일 많이 괴롭힌다.

나는 Javascript에 굉장히 익숙한데,
Javascript는 배열의 Index를 벗어나는 값을 참조해도 undefined가 할당되지, 예외가 터지진 않는다.


그러한 점을 이용한 코드도 굉장히 많이 사용하였는데,
Java로 넘어오면서 굉장히 생경하게 느껴지는 부분 중 하나이다.

 

아, 흥분해서 이 예외에 대한 설명을 넘어갔는데,
인덱스 범위를 초과하면 발생하는 에러이다.

 

String[] strings = new String[2];
System.out.println(strings[3]);

 

위처럼 작성하면 만날 수 있다.

 

 

NumberFormatException

이 친구도 매우 생소한 친구다ㅎㅎㅎ

 

코딩을 하다보면 숫자 형태의 문자열을 숫자로 변환 해야 하는 경우가 굉장히 많다.
Integer.parseInt("123") 를 사용해서 처리를 하는데
만약 위의 코드에서 123이 아니라 abc를 입력하면 발생하는 예외이다.

 

사실 이 친구도 js에는 없는 친구다.
js는 "abc" 를 숫자로 변환시키면, 그냥 NaN으로 변경되고 만다.
에러같은거 안던진다. 그래서 항상 if문으로 isNaN을 이용해 처리를 했었는데,
Java는 그냥 얄짤없다 걍 바로 예외 터트린다.

Java는 참지않긔

 

String numberString = "123";
String realString = "abc";

int number = Integer.parseInt(numberString);
int number = Integer.parseInt(realString); //예외 터짐

 

위와 같이 작성하면 이친구가 친히 방문해준다.

 

이 정도면 내가 자주 만났던 친구들은 다 정리 해본것 같다.
기존에 공부했던 언어와 다른점들이 많아 헷갈리기도 하지만,
비교대상이 있어 더 빨리 학습이 되는거 같기도 하다.

 

원래는 예외처리에 대한 부분도 공부하고 작성하려 했는데,
그냥 js에서 하던가랑 별차이가 없어서 스킵.

728x90
728x90

댓글