언어 공부 내용 정리/Java

자바 예외처리

wosrn 2023. 6. 17. 19:03

예외 : 실행 중 오동작이나 결과에 악영향을 미치는 예상치 못한 상황 발생

예) 정수를 0으로 나누는 경우, 배열의 크기보다 큰 인덱스로 배열의 원소를 접근하는 경우, 정수를 읽는 코드가 실행되고 있을 때 사용자가 문자를 입력한 경우 등
 
이러한 예외는 컴파일 오류와 달리 실행 중에 발생하고, 이를 자바 플랫폼이 가장 먼저 알게되어 현재 실행중인 자바 응용프로그램에게 예외를 전달하여 프로그램이 이에 대응하게 한다. 만약 응용프로그램에 예외에 대처하는 코드가 작성되어 있지 않다면 자바 플랫폼이 응용프로그램을 강제로 종료시킨다 ( exception in thread~~ 메세지를 띄움)
 
예외 처리 : 예외에 대해 개발자가 작성한 프로그램 내에서 대응하는 것

 

1. try - catch - finally 문

 

try {


//예외의 발생이 예상되는 로직 (예외가 발생할 가능성이 있는 실행문)


} catch(예외클래스 인스턴스(처리할 예외 타입 선언)) {


//예외가 발생했을 때 실행되는 로직


}

finally{

//예외 발생 여부와 상관없이 무조건 실행되는 문장, 생략 가능

}
try-catch 문 사용 예시 - 출처 : 구름에듀 생활코딩 자바

위의 예시에서는 수를 0으로 나누려 할 때 에러가 발생할 것을 예상하여 나누기 코드를 try 바디로 감싸고, 예외가 발생했을 때 오류 발생 안내문을 출력하도록 catch 문을 작성했다
Exception e의 exception은 변수 e의 데이터 타입을 뜻하는데, exception은 자바에서 기본적으로 제공하는 클래스로 , java.lang에 소속되어 있다. 예외가 발생하면 자바는 catch를 호출하면서 인자로는 exception클래스의 인스턴스를 전달한다
e.getMessage()는 자바가 전달한 인스턴스의 메소드 중 getMessage()를 호출하는 코드인데, getMessage()는 오류의 원인들 사람이 이해하기 쉬운 형태로 리턴하도록 약속되어 있다
이외에도 Exception의 인스턴스에 메소드가 몇가지 있다

  • e.toString() : getMessage() 보다 더 자세한 예외 정보를 제공한다
  • e.printStackTrace() : getMessage(). toString()과는 다르게 리턴값이 없는 메소드이다. 이 메소드를 호출하면 메소드가 내부적으로 예외결과를 하면에 출력한다. (-> 위의 메소드와 달리 출력문 내에 메소드를 포함시켜 작성하지 않은 이유이다 ) 세 메소드 중 가장 자세한 예외정보를 제공한다

* 예상되는 예외상황이 여러개인 경우, 다중 catch문도 가능하다 ! 

예외 타입 (예외 클래스)예외 발생 상황패키지
ArrayIndexOutOfBoundsException배열의 범위를 벗어난 접근 시 발생java.lang
ArithmeticException정수를 0으로 나눌 때 발생java.lang
Exception포괄적인 예외들java.lang
InputMismatchExceptionScanner 클래스의 nextint()를 호출하여 정수로 입력받고자 하였지만 사용자가 문자를 입력한 경우java.util
NullPointerExceptionnull 레퍼런스를 참조할 때 발생java.lang
ClassCastException변환할 수 없는 타입으로 객체를 변환할 때 발생java.lang
NumberFormatException문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환 시 발생java.lang
OutOfMemoryError메모리가 부족한 경우 발생java.lang
IOException입출력 동작 실패 또는 인터럽트 시 발생java.io

 단 다중 catch문 사용 시에는 Exception을 예외타입으로 하는 catch문을 가장 마지막에 써야한다. Exception이 나머지 클래스에 비해 더 포괄적인 예외를 의미하기 때문이다