- 백기선-JAVA STUDY/WEEK92021년 01월 29일 19시 36분 34초에 업로드 된 글입니다.작성자: jCurve728x90반응형
목표
자바의 예외 처리에 대해 학습하세요.
학습할 것 (필수)
- 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
- 자바가 제공하는 예외 계층 구조
- Exception과 Error의 차이는?
- RuntimeException과 RE가 아닌 것의 차이는?
- 커스텀한 예외 만드는 방법
자바에서 예외 처리 방법
자바에서는 컴파일 에러와 런타임 에러가 존재 한다.
컴파일 에러는 컴파일 과정에서 도출되는 에러이고, 런타임 에러는 실행 과정에서 일어나는 에러이다.
컴파일 과정에서 문제가 없더라도 실행과정에서 에러가 발생할 수 있는데 컴파일 과정에서
필수인 checked Exception은 예외를 반드시 핸들링해야 하며 , 런타임 시 나타나는 에러는
에러가 발생하기전에 미리 확인할 수 없으므로 unchecked Exception이다.
예외 처리
try-catch
try{ //예외 처리하길 원하는 코드; }catch(exception1){ //예외 발생시 실행할 코드; }catch(exception2){ //예외 발생시 실행할 코드; }finally{ //예외 발생 여부와 관계없이 무조건 실행되는 코드; }
try 블록에서 예외가 발생할 수 있는 코드를 작성하고 발생된 예외를 catch블록에서 예외 객를 인수로 전달 받아 처리 한다.
finally는 exception handling 후 마지막에 무조건 실행된다.
try-catch에서 여러개의 예외를 등록하더라도 가장 위의 예외가 발생하면 그 밑의 예외처리 코드는 실행되지 않으며 , 첫 번째 예외가 두 번째 예외의 조상 클래스 일 경우 또한 실행되지않는다.
multicatch block
multicatch block은 여러 예외 처리를 담당한다.
try{ //예외 처리를 원하는 코드; }catch(IllegalArgumentException | ArithmeticException e){ //예외 발생시 실행할 코드; }
여기서 주의할 점은 등록한 두 개의 예외가 상속 관계이면 코드가 중복된 것이기 때문에 에러가 발생한다.
멀티캐치는 한 개의 블록에서 여러 예외를 처리하기 때문에 발생 예외가 정확이 어디에 속한 것인지 알 수 없다.
throw
throw 키워드를 사용해서 예외 객체를 생성할 수 있다. 발생된 예외는 try-catch에서 처리해주거나 메서드를 실행한 곳에서 throws로 처리를 해주지 않으면 에러가 발생한다.
throws
throws 키워드를 사용해서 메서드에 예외를 선언할 수 있다. 여러개의 메서드를 쉼표로 구분해서 선언할 수 있다.
void method() throws Exception1, Exception2, Exception3{ }
throws 는 해당 메서드 사용시 어떤 예외를 처리해야할지 알려주고 예외 처리 책임을 사용하는쪽으로 전가한다.
따라서 메서드를 사용하는 쪽에서는
try{ method(); }catch(Exception1|Exception2|Exception3 e){ //예외 발생시 실행할 코드; }
이처럼 예외 처리를 해주어야한다.
try-with-resources
자바 7에서 부터 사용할 수 있게 되었다. 네트워크 프로그래밍이나 기타 어떤 자원을 사용한 후 반납하기 위해 try-catch문에서 사용하는 예외 처리를 더욱 간편하게 사용할 수 있다.
FileInputStream fs = null; try{ fs = new FileInputStream("ads.txt"); }catch(IOException e){ e.printStackTrace(); }finally{ if(fs != null){ try{ fs.close(); }catch(IOException e){ e.printStackTrace(); } } } }
위에 처럼 자원을 사용한 후 close() 해주기 위한 예외 처리까지 추가로 작성하니 불편하다
하지만 try-with-resource를 사용하면
try(FileInputStream fs = new FileInputStream("adfs.txt")){ // 실행코드; }catch(IOException e){ e.printStackTrace(); }
이처럼 자원 반남을 자동으로 해줌으로 편리하다
try-with-resource를 사용시 작성되는 객체는 AutoCloseable 인터페이를 구현한 객체여야한다.
자바가 제공하는 예외 계층 구조
1.RuntimeException class
2.RuntimeException을 제외한 Exception의 자식 클래스
출처 - http://www.tcpschool.com/java/java_exception_class
Exception과 Error의 차이는?
Error는 하드웨어의 오동작 혹은 고장으로 인해 응용프로그램에 이상이 생기거나 JVM 실행에 문제가 생겼을 경우 발생하며, 프로세스에 영향을 주고 시스템 레벨에서 발생한다.
Exception은 컴퓨터 에러가 아닌 사용자의 잘못된 조작 혹은 개발자의 잘못된 코딩에서 비롯된 오류이다.
예외가 발생하면 프로그램이 종료되는것은 에러와 동일하지만 예외처리를 통해 프로그램을 종료되지 않고 정상적으로 작동되게 만들어 줄 수 있으며, 쓰레드에 영향을 준다
Runtime Exception과 RE가 아닌 것의 차이는?
RE는 실행시 예외가 발생하는 것(UnCheckdedException)이고 컴파일이 예외 검출이 되는것이 CheckedException이다.
CheckedException인 Exception클래스에 속하는 자식 클래스들은 치명적인 예외 상황이 발생되기 때문에 반드시 예외 처리를 해야하며 자바 컴파일러에서도 강제하고 있다.
예외 처리 관련한 글을 보면 트랜잭션시 롤백에 대한 내용을 많이들 언급하는데
"예외 발생 시 트랜잭션 롤백을 하지 않는다
RE는 예외 발생 시 트랜잭션 롤백을 한다."
이런 내용이 많은데 이건 아마 스프링을 연관지어 말씀하시는 것 같습니다.
Rollback이란 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진경우, 트랜잭션을 처음부터 다시 시작하거나, 트랜잭션의 부분적으로만 연산된 결과를 다시 취소시킨는 것이고 트랜잭션은 데이터베이스에서 상태를 변화시키기 위해 수행하는 작업단위를 뜻합니다.
스프링에서는 예외 발생시 롤백을 할 수 있지만 안할 수도 있고 온전히 개발자 마음이지만 default가 runtime exception일 때 롤백이어서 그렇게 연관지어 말하는 것 같습니다.
커스텀 예외 만드는 방법
기존에 정의된 예외 클래스 외에 사용자 필요에 따라 새로운 예외를 정의할 수 있다
Exception 클래스를 상속받는 것이 일반적이며 Error와 관련된 클래스는 개발자가 손대서는 절대 안된다.
public class OwnException{ public static main(String[] args) throws MyException{ method(4); } static void method(int num) throws MyException{ if(num>3){ throw new MyException("custom exception handlling"); } } } class MyException extends Exception{ public MyException(String message){ super(message); } }
반응형'JAVA' 카테고리의 다른 글
백기선-JAVA STUDY/WEEK11 (0) 2021.02.21 백기선-JAVA STUDY/WEEK10 (0) 2021.02.21 백기선-JAVA STUDY/WEEK8 (0) 2021.01.29 백기선 - JAVA STUDY/WEEK7 (0) 2021.01.15 백기선-JAVA/STUDY/WEEK6 (0) 2021.01.07 댓글