본문 바로가기

Java

[자바의 신] 예외

예외는 매우매우 중요하다. 예외를 모르면 자바를 모르는것과 같다.

 

예외를 생각하지 않고는 안전한 프로그램 개발이 불가능하다.

 

자바에서 예외는 우리가 예상한 혹은 예쌍치 못한 일이 발생하는 것을 미리 예견하고 안전장치를 하는것.

 

 try ... catch

<예제>

try 블록 안에 예외가 발생할 수 있는 문장을 묶어주고, catch 블록 안에 예외가 발생했을때 처리를 해준다. 반드시 모든 문장을 묶을 필요는 없고, 예외가 발생하는 부분만 묶어주면 된다. 

<예제>

try ... catch 블록에서 예외가 발생하면 예외가 발생한 문장이후는 실행되지 않고, 바로 catch 블록으로 넘어간다.

<예제 / 결과>

 

반대로 try블록에서 예외가 발생하지 않으면, catch 블록은 실행되지 않는다.

<예제>

 

주의할 사항

변수의 선언

try ... catch 블록도 중괄호로 쌓인 하나의 스코프 중괄호 안에서 선언한 변수를 밖에서 쓸수 없다. 즉, try 블록과 catch 블록도 변수 공유는 안된다. 

 

공유를 위해서는 보통 try 밖에서 변수 선언.

<코드>

 

try ... catch ... finally

 

finally 블록은 어떤일이 있어도(예외가 발생하든 하지 않든) 무조건 실행하라는 의미

 

finally 블록은 코드의 중복을 피하기 위해 반드시 필요하다.

<없을때?>

 

여러개의 catch

 

catch블록의 소괄호에는 예외의 종류를 명시함. 여러개의 catch를 쓸때는 catch블록의 순서가 중요하다. 정확히는 처리하는 예외에 순서가 중요하다는 의미

 

모든 예외의 부모 클래스는 java.lang.Exception클래스. 예외는 부모 예외 클래스가 이미 catch를 하고 자식 클래스가 그 아래에서 catch하도록 되어 있을경우 자식 클래스가 예외를 처리할 기회가 없다.

<코드>

 

보통 여러개의 catch문을 사용할때 가장 마지막에 Exception 클래스로 사용하는 것을 권장한다.

 

 

예외의 종류는 3가지다!

  • checked exception
  • error
  • runtime exception / unchecked exception

error와 unchecked exception을 제외하면 모두 checked exception

 

error

 

에러는 자바 프로그램 밖에서 발생한 예외를 말함.(서버 디스크 고장, 메인보드 고장 등등) 자바프로그램이 제대로 동작하지 못하는 경우가 이에 속함.

 

runtime exception

런타임 예외는 예외가 발생할 것을 미리 감지하지 못했을때 발생. 런타임 예외는 컴파일시점에서 예외가 발생하지 않지만, 실행시에는 예외가 발생할수 있다. 그래서 unchecked exception

 

모든 예외의 할아버지는 java.lang.throwable 클래스

 

exceptoin과 error의 공통 부모 클래스는 당연히 object! 그리고 하나가 더있다. java.lang.throwable 클래스 Exception과 Error클래스는 Throwable 클래스를 상속받아 처리하도록 되어있음.

모두 동일한 이름의 메소드를 사ㅓ용해 처리할 수 있도록 하기 위함.

 

Throwable 클래스에 있고, Exception클래스에서 오버라이딩한 메소드는 10개가 넘는다. 그중 많이 사용되는 메소드는 보자,

 

  1. getMessage()
    • 예외메시지를 String 형태로 제공 받는다.
  2. toString()
    • 예외메시지를 String 형태로 제공 받는다. getMessage() 보다 약간 더 자세하게 , 예외 클래스 이름도 같이 제공
  3. printStackTrace()
    • 첫줄에 예외메시지 출력, 예외가 발생한 메소드들간의 호출관계를 출력.
    • 개발시에만 사용할 것. 로그 터짐.

예외를 발생시키는 방법 throws!

 

try 블록 내에서 throw 라고 명시하고, 예외 클래스 객체를 생성하면 된다.

<코드>

여기서 예외가 발생하면 catch 블록으로 이동한다.

 

만약, catch 블록에 해당하는 예외가 없으면 예외는 메소드 밖으로 던져버린다.  예외가 발생한 메소드를 호출한 메소드로 던진다는 의미이다. 이때 사용하는 것이 throws 구문.

 

throws를 쓰면 try...catch로 묶어주지 않아도 호출한 메소드로 예외를 위임한다. 근데 이렇게 throws를 하면 개발이 어려워진다. 해당 메소드를 호출할때 try...catch로 묶어줘야 하기 때문이다. 호출 하는 쪽에서도 throws를 써서 밖으로 던질수도 있지만, 이는 좋은 방법이 아님.

 

내가 만드는 예외 클래스!

 

예외처리에는 표준이 필요함.

catch블록 안에 아무 코드도 없을경우 예외가 발생했을때 찾을수 없기 때문에 catch 블록에서 어떻게 에러를 처리할지 명시적으로 선언해ㅈ둬야함.

'Java' 카테고리의 다른 글

[자바의 신] 어노테이션  (0) 2020.11.28
[자바의 신] 클래스 안의 클래스  (0) 2020.11.28
[자바의 신] 인터페이스와 추상클래스  (0) 2020.11.20
[자바의 신] Object  (0) 2020.10.21
[자바의 신] 상속  (0) 2020.10.06