본문 바로가기

Java

예외,에러 처리

예외처리의 목적

  1. 예외의 발생으로 인한 실행 중인 프로그램의 비정상 종료를 막기 위해서
  2. 개발자에게 알려서 코드를 보완할 수 있도록 하게 위해서

자바에서는 상속을 이용해서 모든 예외를 표현한다. 모든 예외 클래스는 Throwable의 자손 클래스 이다.

Throwable 에는 크게 두 종류의 자식 클래스가 있다.

Error 는 프로그램이 종료되어야 하는 심각한 문제를 표현합니다. 대부분 컴퓨터나 JVM이 시스템적으로 동작할 수 없는 상황을 표현한다.

Java는 JVM내의 Heap이라는 메모리 공간을 운영체제로부터 할당 받아 사용한다. 할당 받을 수 있는 최대 메모리 이상을 사용하면, JVM이 다운될 수 밖에 없다.

이 경우 OutOfMemoryError가 나면서 프로그램이 종료된다. 자바의 대표적인 에러 상황으로 줄여서 OOM이라고도 한다.

Exception 은 프로그램이 종료되지는 않지만 예외나 문제상황을 표현하기 위해 사용한다.

자바에는 미리 정의 되어있는 예외 클래스 들이 있다.

기본적으로 이미 있는 것을 사용하되, 필요한 것으로 표현할 수 없거나 구체적인 목적을 가진 예외를 정의하고 싶다면, Throwable 또는 그 하위에 있는 예외 클래스를 상속받아서 자신만의 예외 클래스를 정의할 수 있다.

 

실행도중 발생하는 Exception은 RuntimeException을 상속받아서 정의한디.

파일을 읽고 쓰거나, 원격에 있는 저장소로부터 데이터를 읽고 쓸 때 나는 에러를 표현하려면 IOException을 상속받아서 정의한다.

 

예외처리의 형식

try-catch(-finally) 형식

try {
    // 예외가 발생할 가능성이 있는 코드를 구현
} catch (FileNotFoundException e) {
    // FileNotFoundException이 발생했을 경우,이를 처리하기 위한 코드를 구현
} catch (IOException e) {
    // FileNotFoundException이 아닌 IOException이 발생했을 경우,이를 처리하기 위한 코드를 구현
} finally {
    // 예외의 발생여부에 관계없이 항상 수행되어야하는 코드를 구현

 

finally 구문은 필수가 아니며,  예외가 발생하지 않는다면 try → finally 순으로 실행된다.

예외는 중복 catch 블럭을 사용하여 다양한 예외처리를 수행할 수 있다. 중복 catch블럭을 사용할 때는 먼저 선언된 catch블럭부터 확인한다. 앞의 catch블럭에서 잡혔다면, 뒤의 catch블럭으로는 전파되지 않는다. 좁은 범위의 예외부터 앞에 선언하는 것이 좋다.

예제

 

예외,에러 처리 try-catch-finally 예제

public class Main { public static void main(String[] args) { int number = 10; int result; for (int i = 10; i >= 0; i--) { try { result = number / i; System.out.println(result); } catch (Exception e) { System.out.println("Exception발생: " + e.getMessage()

move22.tistory.com

try-with-resource 형식

입출력과 함께 자주 쓰이는 구문이다. 일반적으로 사용되었던 자원을 끝난 후에 닫아줘야 하는 것들이 존재하는데 여기서 try-catch-finally구문보다 편리한 것이 try-with-resource 형식이다.

기존의 try-catch(-finally)문은 자원을 닫을 때 close()를 사용해야 하지만 try-with-resource문은 try문을 벗어나는 순간 자동적으로 close()가 호출된다.

예제

 

예외, 에러처리 try-with-resource문 예제

import java.io.FileOutputStream; import java.io.IOException; public class Main { public static void main(String[] args) { try (FileOutputStream out = new FileOutputStream("test.txt")) { // test.txt file 에 Hello Sparta 를 출력 out.write("Hello Sparta".

move22.tistory.com

메소드에서의 예외 선언

catch문을 이용해서 예외처리를 하지 않은 경우, 메소드에 throws로 예외가 발생할 수 있다는 것을 알려주어야 한다. throws 키워드가 있는 함수를 호출한다면, caller 쪽에서 catch와 관련된 코드를 작성해주어야 한다.

 

void method() throws IndexOutOfBoundsException, IllegalArgumentException {
    //메소드의 내용
}

 

이와 같이 키워드 throws를 사용해서 메소드 내에서 발생할 수 있는 예외를 적어주어야 한다.

'Java' 카테고리의 다른 글

컬렉션  (0) 2022.11.16
날짜와 시간  (0) 2022.11.16
인터페이스  (0) 2022.11.14
추상클래스  (0) 2022.11.14
접근 제어자  (0) 2022.11.14