Java

[Java] 컴파일 오류, 런타임 오류, 예외(exception) 차이 및 자바의 예외처리 클래스와 try-catch-finally

yujinius 2024. 4. 8. 15:20

예외(Exception)란?

자바에서 오동작이나 결과에 악영향을 미칠 수 있는 실행 중 발생한 오류를 예외(exception)라고 한다.

문법에 맞지 않게 작성된 코드는 사전에 컴파일러에 의해 컴파일 오류(compile time error)로 걸러진다.

예외는 사용자의 잘못된 입력이나 배열의 인덱스가 배열의 크기를 넘어가는 등, 예기치 못한 상황에 의해 프로그램 실행 중에 발생한다. 

실행 중 발생하는 예외 예시

  • 정수를 0으로 나누는 경우
  • 배열의 크기보다 큰 인덱스로 배열의 원소를 접근하는 경우
  • 존재하지 않는 파일을 읽으려고 하는 경우
  • 정수 입력을 기다리는 코드가 실행되고 있을 때, 사용자가 문자를 입력한 경우

실행 중 예외 발생하면?

  • 실행 중에 예외가 발생하면 자바 플랫폼이 가장 먼저 알게 되어, 현재 실행 중인 응용프로그램에게 예외를 전달한다.
  • 만일 응용프로그램이 예외에 대처하는 코드를 가지고 있지 않다면, 자바 플랫폼은 응용프로그램을 곧바로 종료시킨다.

실행시간 오류와 예외의 차이 : 예측 & 제어 가능 여부

실행시간 오류(run-time error)

  • 조건문이 잘못 작성된 반복문이 무한루프를 실행하거나, recursion을 제어하는 코드를 잘못 작성하여 스택이 계속 쌓여 스택 오버플로가 일어나 JVM의 메모리가 부족할 때까지 실행되는 등 언제 어디서 발생할지 예측할 수 없다.
  • 발생하였을 때 시스템이나 사용자에게 해를 주거나 강제로 프로그램을 종료시키지 않으면 멈출 수 없는 경우

예외

  • 사용자의 프로그램에서 try-catch 블록을 이용해 제어할(handling) 수 있는 실행시간 오류
  • 파일ㄹ을 여는 코드나 나누기 하는 코드 등을 작성할 때 미리 예상하고 try-catch 블록을 이용해 문제를 바로 잡아(recoverable) 계속 실행되게 하거나, 시스템이나 사용자에게 해를 끼치지 않으면서 정상적인 방법으로 프로그램을 종료시킬 수 있도록 제어 가능한 경우

 

컴파일 오류, 런타임 오류, 예외(exception) 차이 정리

비교 발생 타임 원인
컴파일 오류(compile time error) 컴파일러에 의해 걸러짐 (컴파일 타임) 문법에 맞지 않게 작성된 코드
예외(exception) 실행 중 발생함 (런타임)
예측 및 try-catch로 제어 가능
사용자의 잘못된 입력, 배열 인덱스 등 예기치 못한 상황으로 발생
실행 시간 오류(run-time error) 실행 중 발생함 (런타임)
예측 및 제어 불가
recursion을 제어하는 코드 잘못 작성으로 스택 오버플로우가 일어나 JVM의 메모리 부족해지는 등 예측 불가

 


자바의 예외 클래스

자주 발생하는 예외 ▼

예외 타입(예외 클래스) 예외 발생 경우 패키지
ArithmeticException 정수를 0으로 나눌 때 발생 java.lang
NullPointerException null 레퍼런스를 참조할 때 발생 java.lang
ClassCastException 변환할 수 없는 타입으로 객체를 변환할 때 발생 java.lang
OutOfMemoryError 메모리가 부족한 경우 발생 java.lang
ArrayIndexOutOfBoundsException 배열의 범위를 벗어난 접근 시 발생 java.lang
IllegalArgumentException 잘못된 인자 전달 시 발생 java.lang
IOException 입출력 동작 실패 또는 인터럽트 시 발생 java.io
NumberFromatException 문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환 시 발생 java.lang
InputtMismatchException Scanner 클래스의 nextInt()를 호출하여 정수로 입력받고자 하였지만, 사용자가 'a' 등과 같이 문자를 입력한 경우 javautil

 


예외처리, try-catch-finally 문

try{
	// 에외가 발생할 가능성이 있는 실행문(try 블록)
}
catch(처리할 예외 타입 선언){
	// 예외 처리문(catch 블록)
}
finally{ // finally는 생략 가능
	// 예외 발생 여부와 상관없이 무조건 실행되는 문장(finally 블록)
}
  • finally문은 생략 가능하다.
  • 여러 개의 catch 블록 연속 사용 가능
  • 발생한 예외와 타입이 일치하는 catch 블록이 없으면 프로그램은 강제 종료된다.
  • catch 블록 내에서 System.exit(0)을 호출하면 언제든지 프로그램을 종료할 수 있다.