본문 바로가기
Java

예외처리

by k0o9 2022. 5. 27.

Exception과 Error의 차이

프로그램이 실행 중 어떤 원인에 의해서 오작동하거나 비정상적으로 종료가 되는 경우가 있다. 이때 이러한 결과를 일으키는 원인을 프로그램 에러 또는 오류라고 한다.

에러에는 다음과 같은 3가지 종류가 있다.

  • 컴파일 에러 : 컴파일 시에 발생하는 에러
  • 런타임 에러 : 실행시에 발생하는 에러
  • 논리적 에러 : 실행은 되지만 의도와 다르게 동작하는 것.

자바에서는 실행 시 발생할 수 있는 프로그램 오류를 Error와 Exception 두가지로 구분하였다.

Error = 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
Exception = 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

자바가 제공하는 예외 계층 구조

 

위의 계층 구조를 2가지로 나누어 볼 수 있다.

Checked Exception vs Unchecked Exception

UnChecked Exception(RuntimeException클래스와 자식들) 
: 프로그래머의 실수로 발생하는 예외
: 예외처리를 강제화하지 않는다.
: 런타임 시점에 예외를 확인한다.
Checked Exception(Exception클래스들(RuntimeExcpetion과 자식들 제외) )
: 사용자의 실수로 발생하는 예외.
: 필수적으로 예외처리해야 한다.
: 컴파일 시점에 예외를 확인한다.

자바가 제공하는 예외처리

예외처리

:프로그램의 비정상 종료를 막기위해 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비하여 코드를 작성 한 것.

try-catch

try {
	//예외가 발생할 가능성이 있는 문장
} catch(Exception1 e1) {
	//Exception1이 발생했을경우 이를 처리하기 위한 문장.
} catch(Exception2 e2) {
	//Exception2이 발생했을경우 이를 처리하기 위한 문장.
}

예외의 종류와 일치하는 catch블럭이 없으면 예외는 처리되지 않는다.\

  • try-catch 흐름
- 예외가 발생할 경우
1. 발생한 예외와 일치하는 catch블럭이 있는지 확인한다.
2. catch블럭이 있을경우 catch블럭내 문장을 수행하고 try-catch문을 빠져나간다.
2-1. 찾지 못할 경우 예외발생.

-예외가 발생하지 않을 경우
1.catch블럭을 가지 않고 try-catch문을 나간다.

jdk 1.7부터 catch블럭을 | 기호를 사용하여 하나의 catch블럭으로 합칠 수 있게 되었다. 이를 멀티 catch블럭이라 한다.

이때 |기호로 연결된 예외 클래스가 조상과 자손의 경우 컴파일 에러가 발생한다.

throw

키워드 throw를 사용해서 프로그래머가 고의로 예외를 발생시킬 수 있다.

  1. new연산자를 통해 예외클래스 객체 생성.
  2. throw 키워드를 통해 예외 발생.

throws

예외를 메서드에 선언할려면 메서드 선언부에 키워드 throws를 사용해서 예외를 적어주면 된다. 여러개일 경우에는 ,로 구분한다.

void method() throws Exception1, Exception2 {}

finally 블럭

try-catch문과 함께 예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용한다.

try {
} catch (Exception1 e1) {
} finally {
		//예외의 발생여부에 관계없이 항상 수행되어야 한다.
}

try-with-resource

JDK1.7부터 추가되어서 입출력과 관련된 클래스에서 사용되어진다.

//JDK 1.7이전 자원 해제
public static void main(String args[]) throws IOException {
    FileInputStream is = null;
    BufferedInputStream bis = null;
    try {
        is = new FileInputStream("file.txt");
        bis = new BufferedInputStream(is);
        int data = -1;
        while((data = bis.read()) != -1){
            System.out.print((char) data);
        }
    } finally {
        // close resources
        if (is != null) is.close();
        if (bis != null) bis.close();
    }
}
//try-with-resource

public static void main(String args[]) {
    try (
        FileInputStream is = new FileInputStream("file.txt");
        BufferedInputStream bis = new BufferedInputStream(is)
    ) {
        int data = -1;
        while ((data = bis.read()) != -1) {
            System.out.print((char) data);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

try() 괄호안에 반환해주어야할 객체를 선언하면 try문을 벗어날시 close가 실행된다.

try-with-resources에서 자동으로 close가 호출되는 것은 AutoCloseable을 구현한 객체에만 해당이 된다.

커스텀한 예외처리

class MyException extends Exception {
	MyException(String msg) {
		super(msg);
	}
}

Exception 클래스를 상속받아서 커스텀한 예외를 만들 수 있다.

Exception과 Error의 차이

프로그램이 실행 중 어떤 원인에 의해서 오작동하거나 비정상적으로 종료가 되는 경우가 있다. 이때 이러한 결과를 일으키는 원인을 프로그램 에러 또는 오류라고 한다.

에러에는 다음과 같은 3가지 종류가 있다.

  • 컴파일 에러 : 컴파일 시에 발생하는 에러
  • 런타임 에러 : 실행시에 발생하는 에러
  • 논리적 에러 : 실행은 되지만 의도와 다르게 동작하는 것.

자바에서는 실행 시 발생할 수 있는 프로그램 오류를 Error와 Exception 두가지로 구분하였다.

Error = 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
Exception = 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류

자바가 제공하는 예외 계층 구조

위의 계층 구조를 2가지로 나누어 볼 수 있다.

Checked Exception vs Unchecked Exception

UnChecked Exception(RuntimeException클래스와 자식들) 
: 프로그래머의 실수로 발생하는 예외
: 예외처리를 강제화하지 않는다.
: 런타임 시점에 예외를 확인한다.
Checked Exception(Exception클래스들(RuntimeExcpetion과 자식들 제외) )
: 사용자의 실수로 발생하는 예외.
: 필수적으로 예외처리해야 한다.
: 컴파일 시점에 예외를 확인한다.

자바가 제공하는 예외처리

예외처리

:프로그램의 비정상 종료를 막기위해 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비하여 코드를 작성 한 것.

try-catch

try {
	//예외가 발생할 가능성이 있는 문장
} catch(Exception1 e1) {
	//Exception1이 발생했을경우 이를 처리하기 위한 문장.
} catch(Exception2 e2) {
	//Exception2이 발생했을경우 이를 처리하기 위한 문장.
}

예외의 종류와 일치하는 catch블럭이 없으면 예외는 처리되지 않는다.\

  • try-catch 흐름
- 예외가 발생할 경우
1. 발생한 예외와 일치하는 catch블럭이 있는지 확인한다.
2. catch블럭이 있을경우 catch블럭내 문장을 수행하고 try-catch문을 빠져나간다.
2-1. 찾지 못할 경우 예외발생.

-예외가 발생하지 않을 경우
1.catch블럭을 가지 않고 try-catch문을 나간다.

jdk 1.7부터 catch블럭을 | 기호를 사용하여 하나의 catch블럭으로 합칠 수 있게 되었다. 이를 멀티 catch블럭이라 한다.

이때 |기호로 연결된 예외 클래스가 조상과 자손의 경우 컴파일 에러가 발생한다.

throw

키워드 throw를 사용해서 프로그래머가 고의로 예외를 발생시킬 수 있다.

  1. new연산자를 통해 예외클래스 객체 생성.
  2. throw 키워드를 통해 예외 발생.

throws

예외를 메서드에 선언할려면 메서드 선언부에 키워드 throws를 사용해서 예외를 적어주면 된다. 여러개일 경우에는 ,로 구분한다.

void method() throws Exception1, Exception2 {}

finally 블럭

try-catch문과 함께 예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용한다.

try {
} catch (Exception1 e1) {
} finally {
		//예외의 발생여부에 관계없이 항상 수행되어야 한다.
}

try-with-resource

JDK1.7부터 추가되어서 입출력과 관련된 클래스에서 사용되어진다.

//JDK 1.7이전 자원 해제
public static void main(String args[]) throws IOException {
    FileInputStream is = null;
    BufferedInputStream bis = null;
    try {
        is = new FileInputStream("file.txt");
        bis = new BufferedInputStream(is);
        int data = -1;
        while((data = bis.read()) != -1){
            System.out.print((char) data);
        }
    } finally {
        // close resources
        if (is != null) is.close();
        if (bis != null) bis.close();
    }
}
//try-with-resource

public static void main(String args[]) {
    try (
        FileInputStream is = new FileInputStream("file.txt");
        BufferedInputStream bis = new BufferedInputStream(is)
    ) {
        int data = -1;
        while ((data = bis.read()) != -1) {
            System.out.print((char) data);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

try() 괄호안에 반환해주어야할 객체를 선언하면 try문을 벗어날시 close가 실행된다.

try-with-resources에서 자동으로 close가 호출되는 것은 AutoCloseable을 구현한 객체에만 해당이 된다.

커스텀한 예외처리

class MyException extends Exception {
	MyException(String msg) {
		super(msg);
	}
}

Exception 클래스를 상속받아서 커스텀한 예외를 만들 수 있다.

'Java' 카테고리의 다른 글

Enum  (0) 2022.05.27
Thread  (0) 2022.05.27
인터페이스  (0) 2022.05.27
접근 지시자  (0) 2022.05.27
ClassPath  (0) 2022.05.27