예외란 프로그램이 비정상적으로 종료될 수 있는 코드지점을 말한다.
이를 처리하는 방법에 대해 알아보자.
◆ Throwble
JVM의 비정상 종료를 유발시키는 특수 객체로 Error과 Exception객체들의 최상위 클래스이다.
Throwble은 두 계열의 클래스들이 존재한다. ( Exception / Error )
▶ Error
Throwble의 두 계열 중 하나로, 하드웨어적인 결함 때문에 발생하는 예외에 대한 객체다. 따라서 개발자가 대처할 수 없는 문제들이다.
-
- StackOverFlowError
- 해야 할 작업이 밀리는 경우에 생김 ( Cpu사양 문제 )
-
- OutOfMemoryError
- 허용 메모리가 초과되는 경우에 발생 ( Ram사양 문제 )
▶ Exception
Throwble의 두 계열 중 하나로 프로그램상의 문제로 발생하는 것들이다 따라서 개발자가 대처할 수 있다.
◆ 예외 처리
▶ throw 키워드
Throwable 계열의 객체들만 사용할 수 있는 에러및 예외를 강제로 발생시키는 키워드로, throw를 앞에 붙이고 Throwble계열의 객체를 생성시키면 해당 지점에서 해당 객체가 강제로 발생된다.
▶ try ~ catch ( 예외 처리 )
Exception이나 Error가 발생하여 강제종료 될 수 있는 코드에 종료시키지 않고 catch하여 다시 다른 코드들의 흐름이 계속 진행될 수 있도록 유도해주는 처리
try문 내부의 예외 발생 지점 이후의 코드는 실행되지 않는다.
catch의 매개변수로 들어오는 객체와 일치하는 비정상 종료(예외)가 발생했을 시, 종료하지 않고 catch문을 처리한 후 다음 코드로 계속해서 진행할 수 있게 해준다.
단, 해당 매개인자와 다른 예외는 잡아낼 수 없고 비정상 종료된다.
따라서 모든 비정상 종료를 막고 싶을 때는 catch(Throwble e)로 처리하면 된다.
( 모든 예외는 catch(Exception e) )
▶ catch문의 매개인자 메서드
-
- e.getMessage
- 해당 예외에 대한 간단한 정보를 String으로 반환
-
- e.printStackTrace()
- 해당 예외에 대한 모든 정보를 콘솔창에 출력해주는 메서드.
▶ 반드시 예외처리를 해야하는 Throwable
Throwble중에는 예외 처리를 하지 않으면 컴파일이 되지 않아 반드시 예외처리를 해야 하는 Throwble객체들이 있다. Error계열은 예외처리를 꼭 할 필요는 없고, Exception계열 중 일부는 반드시 예외처리를 해야 하는 객체들이 있다.
-
- Checked Exception
- try~catch를 꼭 해야 함 ( 하지 않으면 컴파일이 실패 )
=> 파일처리, 네트워크처리등
-
- UnChecked Exception
- try~catch가 필수는 아님 ( 컴파일은 되지만 예외 발생시 터짐 )
=> 데이터 오류등
▶ 멀티 catch / 동시처리
- try{}catch(){}catch(){} 의 형식으로 여러 예외상황을 처리할 수 있다.
- catch(IOException | IllegalArgumentException e) 의 형식으로 동시에 처리도 가능하다.(변수는 하나만)
▶ finally
try{} catch(){} finally{} 형식으로 쓰는 finally는 catch에서 잡히던 안 잡히던 무조건 실행되는 구문이다.
즉 catch문 밖에 그냥 작성한 것은 cath로 잡지 못한 다른 예외가 발생한 상황에서는 진행되지 않지만, finally 문에 작성한 코드는 무조건 실행된다.
◆ Exception 상속구조
상위 Exception클래스로 예외 처리(try ~ catch)할 시 하위Exception의 예외 상황을 모두 잡아 낼 수 있다.
ex) StringIndexOutOfBoundsException 과 ArrayIndexOutOfBoundsException 는 IndexOutOfBoundsException의 하위 Exception이기 때문에 상위 클래스하나로 두개의 예외 상황을 모두 잡아낼 수 있다.
-
catch문에 상위클래스를 먼저 작성할 시, 밑에서 하위클래스로 catch하는 것은 불가능하다.
( 어차피 상위클래스에서 모두 잡아내기 때문에 )단, 그 반대의 경우는 가능하다. -
- 최상위 Exception 으로 catch할 시 장/단점
- 장점은 모든 Exception을 다 잡아낼 수 있다는 것이고, 단점으로는 상황별 처리가 불가능하다.
따라서 먼저 특수하게 처리해야 할 Exception계열의 하위클래스들을 처리하고, 밑에 최상위 Exception을 써주는 형태가 가장 많이 쓰이는 형태
◆ 예외 전가( throws )
익셉션을 꼭 직접 예외처리(try ~ catch)해야 되는 것은 아니고, 이 작업을 호출한 곳으로 넘겨서 그쪽에서 처리를 시킬 수 있음.
- 메서드 뒤에 throws 키워드를 붙이고 처리해야하는 Exception 클래스명을 써준다.
=> 이렇게 하면 try~catch없이 Checked Exception을 처리할 수 있다.
주의) main메서드에 붙여두는 것은 좋은 방법은 아니다.
=> main에서는 다른 곳으로 넘기는 것이 불가능하기 때문에 JVM에게 넘기게 되는데 예외가 발생하면 터져 버림