[개인공부] 프로그램 오류, 예외 클래스의 계층구조

Walter Mitty·2022년 12월 22일
0

개인공부

목록 보기
20/40

[ch8-1]

프로그램 오류

  • 컴파일 에러(complie-time error): 컴파일 할 때 발생하는 에러
    • 정확한건 컴파일 타임 에러.
      • javac.exe 파일이 자바 컴파일러인데 원래는 명령어를 써서 컴파일을 해야하는데 이클립스가 알아서 해줌.
    • 프로그램이 만들어 지지 않음 = class 파일이 안만들어줘서 고치기 전까지 실행 안됨
  • 런타임 에러(runtime error): 실행 할 때 발생하는 에러
    • 실행중 발생하는 에러
    • 따라서 실행은 되는데 프로그램이 종료됨
  • 논리적 에러(logical error): 작성 의도와 다르게 동작
    • 프로그램이 종료되지 않고 잘 동작은 하는데 내가 원하는대로 안돌아감...

컴파일러가 하는 일
1. 구문체크 (문법에 맞는지)
2. 번역 잘 되는지
3. 최적화 → 간단한 계산 같은 건 알아서 해줌
4. 생략한 코드들 추가해줌 (extends Object 같은거)

java의 런타임 에러

  • 에러(error) : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
    • 예)
      OOME(out of memory error) : 메모리가 부족해서 프로그램 종료
  • 예외(exception) : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류 → 예외는 처리할 수 있다!



예외처리의 정의와 목적

예외처리(exception handling)

  • 정의: 프로그램 실행 시 발생할 수 있는 예외의 발샹에 대비한 코드를 작성하는 것
  • 목적: 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것.

예외 클래스의 계층 구조

  • 상속계층도
  • exception 클래스와 자손들(진한 핑크) runtime exception과 자손들(연한핑크)
    • Exception 클래스들: 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외
      • or 특정파일 없을 때
    • RuntimeException 클래스들과 자손 클래스: 프로그래머의 실수로 발생하는 예외

IOException: 입출력 예외
ClasNotFoundException: 클래스 파일이 존재하지 않을 때
ArithmeticException: 산술계산 예외
ClassCastException: 형변환 예외
NullPointerException: 널 포인트 에외(가리키는 객체가 아무것도 없음)
indexOutOfBoundException: 배열 길이 벗어났을 때


예외처리하기

try-catch 문

try {
	// 예외가 발생할 가능성이 있는 문장들을 넣는다.
} catch (Exception1 e1) {
	// Exception1이 발생했을 경우, 이를 처리하기 위한 문장을 적는다. 
} catch (Exception2 e2) {
	// Exception2가 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
} catch (ExceptionN eN) {
	// ExceptionN이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
}

참고: if문과 달리 try 블럭이나 catch 블럭 내에 포함된 문장이 하나뿐이어도 괄호{ } 를 생략할 수 없다.

try-catch 문에서의 흐름

① try 블럭 내에서 예외가 발생한 경우,
1. 발생한 예외와 일치하는 catch 블럭이 있는지 확인한다.
2. 일치하는 catch 블럭을 찾게되면, 그 catch 블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행한다.
만일 일치하는 catch블럭을 찾이 못하면, 예외는 처리되지 못한다.

② try 블럭 내에서 예외가 발생하지 않은 경우,
1. catch 블럭을 거치지 않고 전체 try-catch 문을 빠져나가서 수행을 계속한다.

  • 예외가 발생하면, 이를 처리할 catch 블럭을 찾아 내려간다.
  • Exception이 선언된 catch 블럭은 모든 예외처리를 담당한다. 따라서 마지막 catch 블럭에 선언해줘야한다.


    0으로 나누는게 허용이 안되므로 예외발생! 내가 착각했던 점은 예외가 발생해도 일단 try문을 다 시행하는게 아니라 발생한 그 순간부터 catch 문으로 이동한다는것 ! 따라서 2는 안찍힌다.

0개의 댓글