언어공부/Java

자바 예외 처리 방법 - try-catch문, printStackTrace()와 getMessage()

yeony 2021. 6. 3. 00:37

자바 예외 처리 방법에 대해서 알아보자.

 

프로그램의 실행도중에 발생하는 에러는 어쩔 수 없지만, 예외는 프로그래머가 이에 대한 처리를 미리 해주어야 한다. 예외처리(exception handling)란 프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것이며, 예외처리의 목적은 프로그램의 갑작스런 비정상 종료를 막고, 정상적인 실행상태를 유지할 수 있도록 하는 것이다.

 

에러와 예외는 모두 실행 시 발생하는 오류(runtime error)이다. 발생한 예외를 처리하지 못하면, 프로그램은 비정상적으로 종료되며, 처리되지 못한 예외는 JVM의 예외처리기가 받아서 예외의 원인을 화면에 출력한다.


try-catch문

하나의 try블럭 다음에는 여러 종류의 예외를 처리할 수 있도록 하나 이상의 catch블록이 올 수 있으며, 이 중 발생한 예외의 종류와 일치하는 단 한개의 catch블럭만 수행된다. 여러개의 catch블록을 기술할 때는 자손클래스가 먼저 기술되고, 조상클래스가 나중에 기술된다.

 

 

10/2에서는 5로 문제가 없지만 10/0에서는 정수숫자 0으로 나누어서 예외가 발생된다. 해당 예외는 ArithmeticException catch 블록이 실행된다.

 

출력화면

 

발생한 예외의 종류와 일치하는 catch블럭이 없으면 예외는 처리되지 않는다. if문과 달리, try블록이나 catch블록 내에 포함된 문장이 하나뿐이어도 괄호{}를 생략할 수 없다.


  • try블록 내에서 예외가 발생한 경우 : 1. 발생한 예외와 일치하는 catch블록이 있는지 확인. 2. 일치하는 catch블록을 찾게 되면, 그 catch블록 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다. 일치하는 catch블록을 찾지 못하면, 예외는 처리되지 못한다.

 

 

try문에서 3까지 출력이 되고, 10/0에서 예외가 발생하므로 아래의 4는 출력되지 않고 catch문으로 가 5를 출력하게 되고, 다음 catch문을 빠져나와 6을 출력하게 된다.

 

출력화면


  • try블록 내에서 예외가 발생하지 않은 경우, catch블록을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속한다.

 

try블록 내에서 예외가 없는 경우는 catch문을 무시하고 다음 문장을 실행한다.

 

출력화면

 


예외의 발생과 catch블록

catch블럭은 괄호()와 블럭{} 두 부분으로 나눠져 있는데, 괄호()내에는 처리하고자 하는 예외와 같은 타입의 참조변수를 하나를 선언해야한다. 예외가 발생하면, 발생한 예외에 해당하는 클래스의 인스턴스가 만들어 진다. 예외가 발생한 문장이 try블럭에 포함되어 있다면, 이 예외를 처리할 수 있는 catch블럭이 있는지 찾게된다.

 

첫 번째 catch블록부터 차례로 내려가면서 catch블록의 괄호()내에 선언된 참조변수의 종류와 생성된 예외클래스의 인스턴스에 instanceof연산자를 이용해서 검사하게 되는데, 검사결과가 true인 catch블록이 하나도 없으면 예외는 처리되지 않는다.

 

 

마지막 catch(Exception e)는 ArithmeticException을 제외한 모든 예외가 처리된다. 해당 예제는 7/0에서 예외가 발생하므로 ArithmeticException이 발생해 true와 ArithmeticException가 출력된다.

 

출력화면

 

모든 예외 클래스는 Exception클래스의 자손이므로, catch블록의 괄호()에 Exception클래스 타입의 참조변수를 선언해 놓으면 어떤 종류의 예외가 발생하더라도 이 catch블록에 의해서 처리된다.

 

 

모든 예외 클래스는 Exception의 자손이므로 Exception 클래스 타입의 참조변수를 선언해 놓으면 어떤 종류의 예외라도 해당 catch블록에 의해 처리되는 것을 볼 수 있다.

 

출력화면


printStackTrace()와 getMessage()

예외가 발생했을 때 생성되는 예외 클래스의 인스턴스에는 발생한 예외에 대한 정보가 담겨있으며, printStackTrace()와 getMessage()를 통해서 이 정보들을 얻을 수 있다. catch블록의 괄호()에 선언된 참조변수를 통해 이 인스턴스에 접근할 수 있다. 이 참조변수는 선언된 catch블록 내에서만 사용 가능하다.

 

printStackTrace()는 예외발생 당시의 호출스택(Call Stack)에 있었던 메소드의 정보와 예외 메시지를 화면에 출력한다.

getMessage()는 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.

 

 

printStackTrace()는 예외 메시지(by zero)와 예외난 곳(TryEx12.java:8)을 알려주며, getMessage()는 예외 메시지(by zero)만 나온다.

 

출력화면.