*JAVA*

[java] 예외(Exception)

깐부로부터 2021. 10. 30. 17:56

에러(오류)의 종류

- 시스템 에러 : 컴퓨터의 오작동으로 인해 발생하는 에러
    => 소스코드로 해결이 안됨(심각한)

- 컴파일 에러 : 프로그램 실행 전 소스코드상의 문법적인 문제로 발생하는 에러
    => 소스코드 수정으로 해결(빨간줄로 오류 알려줌)

- 런타임 에러 : 프로그램 실행 중 발생하는 에러
                    소스코드상 문법적인 문제가 없는데 발생!!!!
    => 개발자가 예측 가능한 경우 제대로 처리를 안해놓았을 경우
    => 사용자의 잘못일 경우도 있음

- 논리 에러 : 소스코드상 문법적인 문제도 없고,
                 실행했을 때도 굳이 문제가 발생하진 않지만
                 프로그램 의도상 맞지 않는 것(기획가 설계가 잘못되었을 경우 발생)

 

예외 : 시스템에러를 제외한 나머지 컴파일, 런타임, 논리에러와 같은 비교적 덜 심각한 에러들
        특히 런타임에러를 주로 예외로 다룬다!!!!!!!

 

예외처리 : 예외들이 발생했을 경우에 대비해서 처리하는 방법을 정의해두는 것

예외처리의 목적 : 프로그램의 비정상 종료를 막고 정상적인 실행상태를 유지하는 것

 

=> 에러는 어쩔 수 없지만, 예외는 처리하자!

방법
1. try ~ catch문을 이용 

2. throws를 이용(떠넘기기) => 오류가 발상한 메소드를 호출한 부분으로 넘긴다


1. Exception과 자손들 (CheckedException)

사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외

컴파일러가 예외처리 여부 체크(예외처리필수! 빨간줄 뜨기 떄문에 실행조차 안됨!)

 

 

2. RuntimeException과 그의 자손들(UncheckedException)

프로그래머의 실수로 발생하는 예외

컴파일러가 예외처리 여부를 체크 안함(예외처리선택! 빨간줄이 뜨지 않아서 실행된다.)

 

ex)

ArrayIndexOutOfBoundsException : 배열의 부적절한 인덱스로 접근할 때 발생하는 예외
NegativeArraySizeException : 배열의 크기를 음수로 지정할 경우 발생하는 예외
ClassCastException : 허용할 수 없는 형변환이 진행될 경우 발생하는 예외
NullPointerException : 주소값 객체 참조했더니 null이 들어있을 경우 발생하는 예외
ArithmeticException : 나누기 연산 0으로 나누면 발생하는 예외

그밖에 등등등...


예외 처리하기

1. try-catch 구문(직접 처리)

- 예외가 발생하면 이를 처리할 catch 블럭을 찾아 내려간다.

- 일치하는 catch블럭이 없으면, 예외는 처리가 안된다.

- Exception은 예외클래스 최고 조상이므로 다중 catch 블럭일때 맨 마지막에 선언해줘야 

  위에서 자손 예외들 처리후에 넘어온다.

  맨앞에 두면 뒤에 자손예외들은 예외처리할 기회조차 없는 dead code가 된다.

 

 

2. throws(예외 선언하기 == 떠넘기기)

메소드 호출시 발생 가능한 예외를 호출한 쪽으로 떠넘기는 것. (폭탄돌리기)

호출한 메소드가 있는 쪽에서 try-catch구문으로 예외를 처리하도록 위임한다.

throws를 선언하여 발생될것으로 예측 되는 예외를 선언해준다.


예외처리에서 사용할 수 있는 메소드

printStackTrace()

: 예외발생 당시의 호출스택(call Stack)에 있었던 메소드 정보와 예외메세지를 화면에 출력해준다.

 

getMessage()

: 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있다.


finally 블럭

- 예외 발생여부와 관계없이 수행되어야 하는 코드를 넣는다.

- try-catch문의 맨 마지막에 위치해야 한다.

'*JAVA*' 카테고리의 다른 글

[java] IO 스트림  (0) 2021.11.18
[java] API - java.lang 패키지  (0) 2021.11.16
[java] 인터페이스(Interface)  (0) 2021.10.29
[java] 추상클래스(abstract)  (0) 2021.10.29
[java] instanceof  (0) 2021.10.29