본문 바로가기
Language/Java

JAVA입문-8 (예외처리 Exception)

by 드럼치는 코린이 2021. 3. 5.
728x90
반응형


[Exception]

Exception이 발생하면 발생한 지점부터 프로그램이 강제 종료 (Java는 정수를 0으로 나눌 때 예외를 발생시킴)


Java는 예외를 처리할 수 있는 문법을 제공한다 (예외처리)

try {...} : 오류가 발생이 예상되는 부분을 try로 감싼다.

catch {...} : 예외가 발생했을 때 실행할 수 있는 코드를 넣을 수 있다.

finally {...} : 생략가능. 오류 발생 여부에 상관 없이 반드시 실행되는 블록

출처(프로그래머스 입문 자바)


ex. 예외처리 문법 사용 (1) try-catch

* 예외클래스변수명.toString() : 예외의 정보를 알려주는 메서드

예외처리를 통해 catch블록도 실행이 되고 그 이하 나머지 부분들도 실행이 되는 것을 알 수 있다.


ex. 예외처리 문법 사용 (2) finally

1. 오류

2. 오류x 

finally는 오류와 상관 없이 무조건 실행


따라서 Exception을 활용하면 오류가 난 지점부터 프로그램이 강제종료 되었던 것을 막고 잘 실행될 수 있다.

그리고 try블록에서 여러 종류의 Exception이 발생한다면 catch블록을 여러개 사용 할 수 있고,

Exception클래스는 모두 Exception클래스를 상속받기 때문에 예외클래스에 Exception을 두면 어떤 오류를 발생해도 하나의 catch블록안에서 처리가 가능하다.


[Throws] : Exception키워드를 무시하는 Throws.

1. divide메서드 내부인 13번째 줄에서 ArithmeticException이 발생한 것을 처리하려면 13번째 줄을 try로 감싸서 오류를 해결해야 한다. 하지만 그러지 않고 divide메서드를 호출한쪽에게 오류를 처리하도록 할 수 있다.

2. throws를 통해 오류를 통해 divide메서드를 호출한 지점에 try를 감싸고 catch를 통해 오류를 해결한다.

*throws (발생한)Exception명, (발생한)Exception명 처럼 ,를 통해 여러개 입력할 수도 있다


[Exception 발생시키기]

1. 두번째 매개변수 즉, j=0이면 Exception을 발생시킨다.

2. j가 0인지 확인하는 과정에서 return값이 0으로 k=0으로 인식되는 것처럼 예외상황이 되어 프로그램이 종료되는 것도 문제이지만 잘못된 값이 넘어가는 것도 문제가 될 수 있다.

3. return을 대신하여 throw new를 통해 해당 라인에 직접 Exception을 발생시킨다.(Java는 이미 다양한 Exception객체들을 가지고 있기 때문에 상황에 따라 맞는 Exception을 활용하면 된다)

4. 직접 발생시킨 Exception을 throws를 통해 해당 오류를 divide메서드를 호출한 쪽에서 오류를 해결하라는 의미.

5. try-catch를 통해 오류를 해결한다.


[사용자 정의 Exception]

Java에서 이미 정의된 Exception을 사용해도 되지만 사용자가 직접 Exception을 정의하여 사용할 수 있다.

출처(프로그래머스 자바 입문)


출처(프로그래머스 자바 입문)

사용자는 Exception or RuntimeException 클래스를 상속받아 새로운 Exception 클래스를 만들어낼 수 있다.

Exception을 상속받은 클래스를 Checked Exception 이라고 하며 오류처리를 하지 않으면 컴파일 오류가 발생하기 때문에 반드시 오류를 처리해야 하는 Exception이다.

그 이외에 RuntimeException을 상속받아 가지고 있는 Exception들은 반드시 오류처리를 하지 않아도 컴파일상 오류를 발생시키지 않는다. 그러나 모든 예외상황에 대해서는 적절하게 처리를 해주는 것이 프로그래밍이 수행될 때 조금 더 안정적이다.


ex. bizservice라는 클래스가 있다 가정하고, bizservice는 업무와 관련된 기능을 하는데 이것을 비즈니스 메서드라고 한다.

그런데 업무와 관련된 메서드가 실행될 때 오류가 발생한다면..? 해당 메서드는 업무와 관련된 Exception이 발생했다고 해당 메서드를 호출한 쪽에게 알려야 할 것.

RuntimeException을 상속받은 bizException객체를 만들어보자.

1. RuntimeException을 상속받는 BizException을 만들면 UncheckedException으로 생성할 수 있다.

2. 2가지의 문자열로된 오류 메시지와 실제 발생할 Exception을 담는 목적의 생성자를 정의(Exception객체에서는 생성자만 지정해주면 된다.)

이미 부모클래스가 같은 기능을 가지고 있는 생성자가 있기 때문에 사용자가 정의한 Exception객체에서 따로 기능을 정의해줄 필요가 없이 해당 생성자를 부모 생성자에게 전달만 해주면 된다. 즉, super메서드에 매개변수로 전달받은 값만 보내주면 된다.

3. 매개변수 i를 갖는 bizMethod메서드를 만들고 i<0일 때 오류 메시지를 발생시키는 Exception을 생성.

4. BizExam클래스를 통해 bizMethod를 실행시켜보면 5를 입력했을 때는 비지니스 시작~종료가 정상적으로 출력되지만 -3을 입력했을 때는 비지니스 시작 후 Exception을 발생시키면서 "매개변수 i는 0 이상이어야 합니다"를 출력하게 된다.

728x90
반응형

댓글