예외처리 (throwable, exception, error, throws)  

참조문서 : https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html

1. 예외처리란?

Exception Handling 이라고 하며, 잘못된 하나로 인해 전체 시스템이 무너지는 결과를 방지하기 위한 기술적인 처리이다. java에서는 예외와 에러도 객체로 처리한다.

예외가 주로 발생하는 원인

  • 사용자의 잘못된 데이터 입력
  • 잘못된 연산
  • 개발자가 로직을 잘못 작성
  • 하드웨어, 네트워크 오작동
  • 시스템 과부하

2. Throwable 클래스

(클릭하면 크게 보인다..)

Throwable 클래스는 예외처리를 할 수 있는 최상위 클래스이다. Exception과 Error는 Throwable의 상속을 받는다. 유명한 것들만 정리해보았으며, 실제로 더 많다. io.IOException도 lang.Exception의 상속을 받는다.

에러(Error)와 예외(Exception)

  • 에러는 시스템 레벨에서 발생하여, 개발자가 어떻게 조치할 수 없는 수준을 의미. ex. JVM OOM
  • 예외는 개발자가 구현한 로직에서 발생하며, 개발자가 다른 방식으로 처리가능한 것들, JVM은 정상 동작. ex. 인덱스범위 검사

3. 예외 (Exception)

예외의 2가지 종류

  • Checked Exception : 예외처리가 필수이며, 처리하지 않으면 컴파일X. JVM 외부와 통신(네트워크, 파일시스템 등)할 때 주로 쓴다.
    • RuntimeException 이외에 있는 모든 예외
    • IOException, SQLException 등
  • Unchecked Exception : 컴파일 때 체크되지 않고, runtime에 발생하는 Exception을 말한다.
    • RuntimeException 하위의 모든 예외
    • NullPointerException, IndexOutOfBoundException 등

대표적인 클래스들

  • NullPointerException : Null 레퍼런스를 참조할때 발생, 뭔가 동작시킬 때 발생한다.
  • (XXX)IndexOutOfBoundsException : 배열과 유사한 자료구조(문자열, 배열, 자료구조)에서 범위를 벗어난 인덱스 번호 사용으로 발생
  • (XXX)FormatException : 문자열, 숫자, 날짜 변환 시 잘못된 데이터(ex. "123A" -> 123 으로 변환 시)로 발생, 보통 사용자의 입력, 외부 데이터 로딩, 결과 데이터의 변환 처리에서 자주 발생한다.
  • ArthmeticException : 정수를 0으로 나눌때 발생
  • ClassCastException : 변환할 수 없는 타입으로 객체를 변환할 때 발생
  • IllegalArgumentException : 잘못된 인자 전달 시 발생
  • IOException : 입출력 동작 실패 또는 인터럽트 시 발생
  • IllegalStateException : 객체의 상태가 매소드 호출에는 부적절한 경우
  • ConcurrentModificationException : 금지된 곳에서 객체를 동시에 수정하는것이 감지될 경우 발생
  • UnsupportedOperationException : 객체가 메소드를 지원하지 않는 경우 발생

주요 메소드들

  • printStackTrace() : 발생한 Exception의 출처를 메모리상에서 추적하면서 결과를 알려준다. 발생한 위치를 정확히 출력해줘서 제일 많이 쓴다. void를 리턴한다.
  • getMessage() : 한줄로 요약된 메세지를 String으로 반환해준다.
  • getStackTrace() : jdk1.4 부터 지원, printStackTrace()를 보완, StackTraceElement[]이라는 문자열 배열로 변경해서 출력하고 저장한다.

4. 에러 (Error)

개발자는 error 가 발생했다는 사실을 알 수는 있다. 유명한 에러로는 다음과 같다.

  • OutOfMemoryError : JVM에 설정된 메모리의 한계를 벗어난 상황일 때 발생한다. 힙사이즈가 부족하거나, 너무 많은 class를 로드할때, 가용가능한 swap이 없을때, 큰 메모리의 native메소드가 호출될 때 등이 있다. 이를 해결하기위해 dump 파일분석, jvm 옵션 수정 등이 있다.

5. 예외처리를 해보자

java에서 모든 예외가 발생하면 (XXX)Exception 객체를 생성한다. 예외를 처리하는 방법에는 크게 2가지가 있다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

  • 직접 try ~ catch 를 이용해서 예외에 대한 최종적인 책임을 지고 처리
  • throws Exception 을 이용해서 발생한 예외의 책임을 호출하는 쪽이 책임지도록 함, 주로 호출하는 쪽에 예외를 보고할 때 사용(다른 메소드의 일부분으로 동작하는 경우엔 던지는 거 추천)

5-1. 예외 잡기 (try ~ catch 구문)

로직 중에 예외가 발생할지도 모르는 부분에 try ~ catch 구문으로 보험처리한다.

  • try 에는 위험한 로직이 들어가고, catch 에는 예외 발생 시 수행할 로직이 들어간다.
  • try 중이라도 예외가 발생한 다음의 코드들은 실행되지 않으며 catch 구문으로 넘어간다.
  • catch 구문은 여러개 쓸 수 있다. else if 처럼..
  • finally 는 마지막에 실행하고 싶은 로직이 들어간다. .close()가 대표적

5-2. 예외 던지기 (throws 구문)

예외 처리를 현재 메소드가 직접 처리하지 않고 호출한 곳에다가 예외의 발생 여부를 통보한다. 호출한 메소드는 이걸 또 던질건지 직접 처리할 건지 정해야한다.(return보다 강력)

public class ThrowsEx {
    public void call_A() throws Exception {
        call_B();
    }

    private void call_B() throws Exception {
        call_C();
    }

    private void call_C() throws Exception {
        System.out.println(1 / 0);
    }

    public static void main(String[] args) throws Exception {
        ThrowsEx test = new ThrowsEx();
        test.call_A();
    }
}

실행 결과는 아래와 같다.

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at exception.ThrowsEx.call_C(ThrowsEx.java:13)
    at exception.ThrowsEx.call_B(ThrowsEx.java:9)
    at exception.ThrowsEx.call_A(ThrowsEx.java:5)
    at exception.ThrowsEx.main(ThrowsEx.java:18)

6. 사용자 정의 예외

개발자가 새로운 예외 클래스를 만들 수 있다. 보통은 Exception 클래스를 상속받아 만든다.



출처: https://sjh836.tistory.com/122 [빨간색코딩]

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
27 [java][maven] jar 파일 의존성 한번에 다운로드 maven 사용 졸리운_곰 2023.08.24 192
26 Prometheus + Grafana로 Java 애플리케이션 모니터링하기 file 졸리운_곰 2020.12.17 279
25 Blockchain Implementation With Java Code file 졸리운_곰 2019.06.16 338
24 Java 코드로 이해하는 블록체인(Blockchain) 졸리운_곰 2019.06.16 377
23 순수 Java Application 코드로 Restful api 호출 졸리운_곰 2018.10.10 415
22 WebDAV 구현을 위한 환경 설정 file 졸리운_곰 2017.09.24 268
21 [Java] Apache Commons HttpClient로 SSL 통신하기 졸리운_곰 2017.03.27 784
20 JSoup를 이용한 HTML 파싱 졸리운_곰 2017.03.04 320
19 jsoup을 활용해서 Java에서 HTML 파싱하는 방법 정리 file 졸리운_곰 2017.03.04 579
18 NSA의 Dataflow 엔진 Apache NiFi 소개와 설치 file 졸리운_곰 2017.01.23 630
17 wordpress-java-integration 자바와 워드프레스 통합 졸리운_곰 2016.12.30 298
16 Create New Posts in Wordpress using Java and XMLRpc 졸리운_곰 2016.11.14 268
15 자바로 POST 방식으로 통신하기, java httppost 클래스를 활용한 예제 졸리운_곰 2016.11.14 647
14 [Java]아파치 HttpClient사용하기 file 졸리운_곰 2016.11.14 301
13 Building a Search Engine With Nutch Solr And Hadoop file 졸리운_곰 2016.04.21 435
12 Nutch and Hadoop Tutorial file 졸리운_곰 2016.04.21 391
11 Latest step by Step Installation guide for dummies: Nutch 0. file 졸리운_곰 2016.04.21 305
10 Nutch 초간단 빌드와 실행 졸리운_곰 2016.04.21 681
9 Nutch로 알아보는 Crawling 구조 - Joinc 졸리운_곰 2016.04.21 536
8 A tiny bittorrent library Java: 자바로 만든 작은 bittorrent 라이브러리 file 졸리운_곰 2016.04.20 418
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED