[Java] 예외

이현준·2020년 10월 1일
0

Java

목록 보기
3/15

예외 처리의 기본 개념

예외란?

정상적인 경우에는 일어나지 않지만 발생할 수 있는 문제를 말함

개발 과정에서의 예외처리

예외 처리를 통해 프로그램 오류 발견 및 수정

개발 이후의 예외처리

예외가 발생하여도 프로그램이 계속 수행될 수 있도록 함

예외처리를 극복하지 못하는 경우

  • 자체적으로 극복할 수 없는 예외에 대해서도 다음을 보장해 주어야 함
    • 사용자에게 오류 사실을 알림
    • 현재 작업을 저장
    • 우아하게 종료할 수 있도록 해줌

프로그래밍할 때 고려해야 하는 문제들

기존의 예외 처리 방법(.feat 구조화 프로그래밍)

  • int foo() 같은 함수가 마이너스 범위와 플러스 범위를 모두 반환한다고 했을 때 특정 반환값을 통해 에러를 판단하기가 어려움(이럴때 보통 errorno 전역변수를 사용해서 처리한다고 함)
  • 보통 함수가 끝나자마자 에러를 바로 처리해줘야한다.(그렇지 않으면 계속 누적되기 때문에)

OOP에서 예외 처리 기법

예외 처리 관련 주의사항

예외 발생

프로그램의 논리오류

예) 0나누기, 배열 색인 오류

특정 문제의 발생을 알리기 위해 직접 발생

예) 은행계좌에서 인출 과정에서 잔액 부족

  • throw문 사용

throw

  • throw 문이 되면 함수 종료

예외의 전달

  • 에러를 못잡으면 상위 메소드로 계속 전달된다.

예외 객체

  • 문자열은 디버깅이 목적이다.

Catch

매개변수 타입에 해당하는 예외는 인자 타입과 그것의 모든 후손 타입을 말함 (상속과 관련)

순서가 중요하다

finally (선택, try-with-resource 기법때문에 최근에는 별로 안쓴다.)

예외 공표

  • 공표는 꼭해야되는건 아님(특히 Unchecked)

예외 분류(unchecked 예외와 checked 예외란?)

unchecked - 분류 2-1 : 명시적인 예외 처리를 강제하지 않는 특징이 있기 때문에 Unchecked Exception이라 하며, catch로 잡거나 throw로 호출한 메서드로 예외를 던지지 않아도 상관이 없다. 보통 수정하기 위해서 예외를 확인해본다. 즉 발생하도록 내버려두고 => 오류 수정
checked - 분류 2-2 : 반드시 명시적으로 처리해야 하기 때문에 Checked Exception이라고 하며, try catch를 해서 에러를 잡든 throws를 통해서 호출한 메서드로 예외를 던져야 한다. 보통 상황을 극복하거나 상황에 대한 정보를 통해 사용자에게 메세지를 띄어주기 위해 예외처리를 한다. => 발생하면 => 예외처리
자바는 강건성을 중요시 하였기 때문에 checked 예외에 대해서는 처리를 강제화함(자바에서 오바했다고 함- 잘못된 설계라고 말함)

처음상자는 문법 오류, checked 예외를 처리하지 않았기 때문에
그래서 왼쪽 아래나, 가운데 아래쪽 상자처럼 처리해준다.
왼쪽 아래 상자 : 여기서 예외처리
가운데 아래 상자 : 위에서 예외처리하기를 원함
오른쪽 아래 상자는 f와 g 둘다 null 에러를 발생시킬 수 있기 때문에 아예 저렇게 에러를 방지함(이렇게 unchecked 에러는 잡아줘야한다.)

자바 예외 클래스 계층 구조

RuntimeException 예외

새 예외 클래스 만들기

이 예외는 어떤 예외가 될것인가?

  • 개발자 실수(프로그래밍 오류)인가? => (unchecked)
  • 사용자 실수인가? => (checked)
  • 프로그래밍을 통해 방지할 수 있나? => (unchecked)
  • 배포 버전에서도 필요한 오류인가? => (checked)

  • 위에는 예제가 unchecked 예외로 만들어져있지만 checked 예외가 더 어울릴거 같아서 checked 예제로 만들어봄 (예외가 사용자 실수로 발생하기 때문에)

예외와 상속

예외처리 Tip



assert

  • 자바에 코드가 남아있어서 별로이다. 그래서 아예 amount가 0으로 호출 안되게 하고 그냥 아래처럼하고 나중에 코드를 삭제하는게 더 낫다.

프로그램 오류 줄이기 Tip

  • 차라리 빈 리스트나 배열을 반환해라

Objects 관련


1,3번째 보다는 2번째 4번째 상자가 더 권장됨
requireNonNullElse => null일 때 예외를 던지게 하지 않고 대체 값을 전달할 수 있다.
requireNonNullElseGet => requireNonNullElse 동작이 같은데 기본값을 계산하기 힘들다면 람다 표현식을 통해 함수를 작동시켜서 대체 값을 전달한다.

Optional(범용 타입)


좋은 점 : Optional로 하면 얘가 값을 안 줄수도 있구나를 좀 더 명확히 고려할 수 있음. Student라고 했을 때는 값을 안 줄지 잘 모름

0개의 댓글