오늘은 자바 기본 문법을 공부하며 알게 된, 예외 처리와 예외를 발생시키는 방법에 대해 공부한 과정을 정리해 보려고 합니다.
자바 예외 처리
자바는 코드 상에서 try, catch 구문을 이용해서 예외 처리 구문을 작성할 수 있습니다.
동작 방식을 간단히 정리하면, try 구문에 작성한 코드에서 에러가 발생하는 것을 감지하고, catch 구문에서 예외 처리를 다루는 구조로 동작합니다.
catch 구문은 여러 개를 작성할 수 있는데, 이때 각각의 catch 구문에는 어떠한 에러를 다룰 것인지를 명시해 줘야 합니다. 그러면 각각의 오류에 맞는 catch 구문이 예외를 처리하는 구조를 띄게 됩니다.
위 코드와 같이 divide by zero 에러가 런타임에 발생하면, java.lang.ArithmeticException 예외가 "main" thread에서 발생하게 되는데, catch 구문에서 ArithmeticException 에러가 발생했을 때, 예외 처리를 진행할 코드를 등록해 놓으면 이 코드로 넘어가서 예외 처리를 진행하게 됩니다.
예외처리 코드 이후에는 try, catch 구문 이외의 남은 코드는 계속해서 실행됩니다.
위의 예시 코드는 새로운 예외에 대한 예외처리 catch 구문을 추가한 예시입니다. 이 상황에서는 두 가지 예외 중에서 배열의 길이를 벗어나는 에러가 먼저 발생하기 때문에, 두 번째 catch 구문이 실행되고 이후에 예외처리 구문 밖의 코드가 이어서 실행될 것입니다.
이렇게 error의 toString method를 사용해서 에러의 원인을 간단하게 확인할 수도 있었습니다. (toString method는 실제 개발 시에도 매우 유용할 것 같습니다.)
자바 예외 발생
예외 처리를 하는 방법도 매우 중요하지만, 코딩을 하면서 예외를 발생시켜야 하는 상황이 있기 마련입니다. (의도대로 동작하는 프로그램을 구현하기 위함이지 않을까 생각합니다.)
발생한 예외를 던지는 방법으로는 먼저 throws를 활용하는 방법이 있다고 합니다.
앞서 정리한 try, catch 구문을 이용하면, 우리는 실행하는 메서드 내에서 발생하는 오류를 detecting 하고 예외 처리를 진행할 수 있었습니다.
하지만, throws 예약어를 이용한 방법은 현재 메서드 내에서 오류를 처리하는 것이 아니라 메서드 내부 코드에서 에러가 발생했을 때, 메서드를 사용하는 곳으로 error를 던져서 책임을 전가하는 방식입니다.
본인이 예외를 처리하는 것이 아니라 발생한 예외를 메서드를 사용하는 곳으로 던지기 때문에, throws라는 이름이 붙은 게 아닐까 싶었습니다.
코드에서 변경된 점을 찾자면, divide by zero가 divide 메서드를 실행하는 상황에서 발생하고, 이전처럼 코드 실행 중에 try, catch를 이용한 예외 처리를 진행하는 것이 아니라 throws를 통해 메서드를 사용하는 곳으로 에러를 전가하게 됩니다.
main method는 예외를 전가받게 되고, 이에 따라서 main method에서 try, catch 구문을 이용해 예외 처리를 진행합니다.
throws 뿐만 아니라 throw라는 것도 존재합니다.
둘이 's' 하나 차이라 유사해 보이지만, 기능에는 엄연한 차이점이 존재합니다.
throws는 메서드에서 발생한 에러를 전가시키기 위해서 사용한다면, throw는 실행 즉시에 예외를 발생시킬 때 사용합니다.
무슨 말인지는 코드를 보면, 더 이해하기 쉬울 것 같습니다.
이렇게 코드를 짜보면, 실행 결과는 다음과 같습니다.
이렇게 throw의 사용방법까지 정리해 봤습니다.
Error를 생성할 때, 인자로 error message를 넘겨주고, 이걸 toString() method를 이용해서 출력할 수 있는 점까지 추가로 공부할 수 있었습니다!
References
https://m.blog.naver.com/highkrs/220238284097
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=highkrs&logNo=220239297118
https://www.javatpoint.com/try-catch-block
'TIL(Today I Learned)' 카테고리의 다른 글
[JAVA] java.util 패키지 정리 (0) | 2023.02.01 |
---|---|
[Java] java.lang 패키지 정리 (0) | 2023.01.31 |
@RequestParam vs @RequestBody vs @RequestPart 공부한 내용 정리 (0) | 2023.01.31 |
[NCP] 네이버 클라우드 플렛폼에서 서버 만들어보기 (0) | 2022.12.28 |
JSON (JavaScript Object Notation) 개념 정리 (2) | 2022.07.30 |
댓글