예외 처리 - 1

김나영·2023년 6월 15일
0

Java 문법 종합반

목록 보기
16/21

1. 오류 Vs 예외

1) 오류(Error)

  • 회복이 불가능한 문제

  • 시스템 레벨 혹은 환경적인 이유로 발생

2) 예외(Exception)

  • 회복이 가능한 문제

  • 회복이 가능하다는 전제는 우리가 그 예외가 발생할 수 있다는 것을 인지하고 대응하는 것

2-1) 예외의 종류

👁️ 코드실행 관점에서의 예외의 종류

  • ① 컴파일 에러

    • .java 파일을 .class 파일로 컴파일 할 때 발생하는 에러

    • 대부분 자바 프로그래밍 언어의 규칙을 지키지 않았을 때 발생

    • ex)

      • 존재하지 않는 클래스를 호출하거나 접근이 불가능한 프로퍼티나 메소드에 접근할 때
  • 문법에 맞게 다시 작성하면 해결

  • ② 런타임 에러

    • 주로 다루게 되는 에러(예외)
    • 문법적인 오류는 아니라서 컴파일은 잘 되었지만 프로그램이 실행도중 맞닥뜨리게 되는 예외

👁️ 예외처리 관점에서의 예외의 종류

  • ① 확인된 예외(Checked Exception)

    • 컴파일 시점에 확인하는 예외
    • 반드시 예외 처리를 해줘야하는 예외
    • 이미 특정한 문제를 인지하고 있어서, 해당 예외를 정의해두었고, 정의해두었기 때문에 컴파일 하는동안 이 예외에 대한 예외처리를 했는지 확인(Check) 할 수 있는 예외
  • ② 미확인된 예외(Unchecked Exception)

    • 런타임 시점에 확인되는 예외

    • 예외 처리가 반드시 필요하지 않은 예외


2. 예외 발생과 try-catch, finally문

1) 예외처리의 흐름

① 예외를 어떻게 정의하고

② 예외가 발생 할 수 있음을 알리고

  • 예외가 발생할 수 있는 Logic에 어떠한 flag를 달아놓는다

③ 사용자는 예외가 발생 할 수 있음을 알고 예외를 핸들링 하는지

2) 예외 정의하기

class OurBadException extends Exception {
	public OurBadException() {
		super("위험한 행동을 하면 예외처리를 꼭 해야합니다!");
	}
}

3) throw, throws

  • 클래스를 만들고, 메서드를 만들며 우리의 메서드가 위험하다고 알리기
public class OurClass {
    private final boolean just = true; // final이 있기 때문에 절대 바꿀 수 없음

    // throws : 던지다!!(=예외를 던지다 / 발생시키다)
    public void thisMethodIsDangerous() throws OurBadException{ // Exception도 가능하지만 더 구체적으로 하기 위해 사용
        // custom logic이 들어있음
        if (just) {
            throw new OurBadException();
        }
    }
}
  • 메서드가 실행이 될 때는 만약에 just(true)로 들어왔다고 한다면 새로운 OurBadException을 만들어 던진다.
throwsthrow
메서드 이름 뒤에 붙어(=> method throws ~Exception) 이 메서드가 어떠한 예외사항을 던질 수 있는지 알려주는 예약어메서드 안에서, 실제로 예외 객체를 던질 때 사용하는 예약어
여러 종류의 예외사항을 적을 수 있음 => extends Exception실제로 던지는 예외 객체 하나와 같이 써야 함 => throw new ~Exception
일반 메서드의 return 키워드처럼 throw 아래의 구문들은 실행되지 않고, throw문과 함께 메서드가 종료됨
  • throw new ~Exception : 새로운 Exception 객체를 만들어서 던진다.

  • throws Exception : 디테일한 예외 사항을 적을 수 없음

4) handling

  • 위험한 메서드를 사용한다면, 예외를 handling
public class StudyException {
    public static void main(String[] args) {
        OurClass ourclass = new OurClass();

        // try ~ catch ~ finally 구문
        // try : 시도하다
        // catch : 잡다(붙잡다)
        // finally : 마침내

        // 일단 try해 ~~~ 그리고, 예외가 발생하면 그걸 잡아!!(catch)
        // 그리고, 정상적으로 수행되든. 예외가 발생하든 결국 마침내 수행해야 하는 로직을 'finally' 수행해
        try {
           // 1. 위험한 메소드의 실행을 "시도"(일단 실행)
           // "시도" 해보는 코드가 들어가는 블럭
            ourclass.thisMethodIsDangerous(); // OurClass에서 위험하다고 예외처리를 했는데 호출하고 있어 빨간줄이 표시됨
        } catch (OurBadException e) { // () 필수 왜? 무슨 종류의 예외 사항을 catch할 것인지를 명시해줘야 하니까
          // 2. 예외가 발생하면, "잡아서" handling
         // 예외가 발생하는경우 "handling" 하는 코드가 들어가는 블럭
    	// 즉 try 블럭 내의 구문을 실행하다가 예외가 발생하면
		// 예외가 발생한 줄에서 바로 코드 실행을 멈추고
		// 여기 있는 catch 블럭 내의 코드가 실행됨
            System.out.println(e.getMessage()); // error 객체가 가지고 있는 오루 내용을 출력
        } finally {
            // 무조건 여기는 거침!!!
            System.out.println("우리는 방금 예외를 handling 했습니다. 정상처리되든, 예외사항이 발생하든 여기를 거쳐요!!");
        }

    }
}
  • 위험을 감지했을 때 try-catch finally 사용

    • try** - **catch 는 각각 중괄호{} 를 통해 실행할 코드들을 담는다.

    • try 단어의 “시도한다” 라는 뜻에 맞게 의 중괄호{} 안에는 예외가 발생할 수 있지만 실행을 시도할 코드를 담는다.

    • catch 단어의 “잡는다”라는 의미에 맞게 중괄호{} 안에는 try 안에있는 코드를 실행하다가 예외가 났을때 실행할 코드를 담는다.

      • catch 는 소괄호() 를 통해 어떤 예외클래스를 받아서 처리할지 정의
      • catch 로 모든 예외를 다 받고 싶으면 Exception 을 넣어주면 됨
      • catch 로 일부 예외만 받아서 처리하고 싶으면 해당 예외 클래스명을 넣어주면 됨
      • 1개의 try 문에 catch 문은 여러개 사용 가능
      • ex) 1try : 4catch
    • 기존 try - catch 의 맨 마지막에 finally 를 붙여서 마지막에 반드시 실행할 코드를 넣을 수 있음

0개의 댓글