본문 바로가기

Java

자바 예외처리 / catch

예외 / 예외 클래스

 

오류의 종류

  • 에러 : 하드웨어의 잘못된 동작, 고장으로 인한 오류로 에러 발생되면 프로그램이 종료되고 정상 실행 상태로 돌아갈 수 없음
  • 예외 : 사용자의 잘못된 조작, 코딩으로 인한 오류로 예외가 발생되면 프로그램이 종료됨

 

 

Exceotion 일반 예외 (컴파일오류)

Runtime Exception 실행 예외 (예외 처리코드를 생략하더라도 컴파일은 되지만 예외임)

Exceotion 일반 예외

 

Exception 클래스 예외 (사용자가 발생하는 예외)

  • FileNotFoundException
  • 존재하지 않는 파일의 이름을 입력
  • ClassNotFoundExxeption
  • 클래스의 이름을 잘못 적은 경우
  • DataFormatException
  • 입력된 데이터 형식이 잘못된 경우

 

실행 예외 (프로그래머의 실수로 발생하는 예외)

  • NullPOinterExceptionnull                           객체 잠조가 없는 상태
    값 갖는 참조변수로 객체 접근 연산자인 도트 (.) 사용했을 때 발생함

  • ArrayIndexOutOfBoundsException            인덱스 범위를 초과했을 경우

  • ClassCastException                                  강제변환
       
           타입변환 전에 타입변환이 가능한지 instanceof 연산자로 확인하는 것이 좋음! (true이면 좌향객체를 우향타입으로 변환 가능)

  • NumberFormatException
          숫자가 실행되지 않을 때 (공백,빈칸 모두 포함해서 온전한 숫자만 허용)

 

예외 처리 코드(try-catch)

(try - catch - finally ) : 예외가 발생될 수 있는 모든 곳에 작성하는 것이 원칙
       


(try - catch - return )

return; 이 없으면 예외발생 후 catch값 출력 후 프로그램이 종료되지 않고 밑의 코딩까지도 계속 실행이 됨

catch 에는 try에서 발생하는 예외클래스명이 함께 들어가야 함

정확한 클래스를 모른다면 Exception 만 넣어줘도 가능은 함 (최상위 클래스)

[try 블럭 내에서 예외가 발생한 경우]

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

예외가 발생하면 발생한 예외에 해당하는 클래스의 인스턴스가 만들어짐

예외가 발생한 문장이 try 블럭에 포함되어 있다면, 이 예외를 처리 할 수 있는 catch 블럭을 찾게됨

첫번째 catch블럭부터 차례로 내려가면서 catch 블럭의 괄호내에 선언된 참조변수의 종류와 생성된 예외클래스의 인스턴스에 instanceof연산자를 이용해서 검사하고 결과가 true 이면 예외처리를 한다.

검사결과가 true인 catch 블럭이 하나도 없으면 예외는 처리되지 않는다.


[try 블럭 내에서 예외가 발생하지 않은 경우]

catch 블럭을 거치지 않고 전체 try-catch문을 빠져 나가서 수행을 계속함

 


다중 catch

다중 catch

발생되는 예외별로 예외 처리 코드를 다르게 하기 위해

 

catch의 순서

상위 클래스가 위에 위치해야함 (위에서 부터 차례로 진행되는 예외별로 순서대로)

exception을 사용할 시에는 단독으로 사용하거나 맨 끝에 사용할 것

 

멀티 catch ( | 기호를 사용해 합치는 )

하나의 catch 블록에 적을시에는 괄호 안에 동일하게 처리하고 싶은 예외를 | 로 연결 할 것

기호로 연결할 수 있는 예외클래스의 개수에는 제한이 없다.

*조상과 자손의 관계에 있는 catch 블럭을 멀티 catch 블럭으로 합칠 수 없다. 공통멤버만 사용할 수 있다.

 

getMessage()

: 발생한 예외 클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.

예외가 발생하면 예외객체가 만들진다.

발생한 예외객체를 catch 블럭의 참조 변수로 접근할 수 있다.

 

자동 리소스 닫기

리소스 : 데이터를 읽고 쓰는 객체

close() 메소드를 호출해서 안전하게 리소스를 닫음

 

예외 발생 시키기 _ throw

throw를 사용해 프로그래머가 예외를 발생시킬 수 있다.

  1. new 이용해 발생시키려는 예외 클래스의 객체를 만듬
  2. Exception e = new Exception
  3. 키워드 throw를 이용해서 예외를 발생시킴
  4. throw e;

Exception 인스턴스를 생성할 때 생성자에 String 넣어주면, String이 Exception인스턴스에 메시지로 저장됨

메예외 떠넘기기

 

메소드에 예외 선언하기 _throws

메소드를 호출한 곳으로 예외를 떠넘길 수있는데, 그때 throws를 사용함

메소드 선언부() 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할이며, 쉼표로 구분해서 나열해줌

use : (메소드를 만들때 생성하거나/ 가져다 쓸때 생성하거나)

모든 예외를 떠넘기기 위해

 

Finally 블럭

예외의 발생 여부와 관계없이 실행 되어야 하는 코드를 넣음

선택적 사용이 가능하며 try → catch → finally 순서로 실행되고 예외 미 발생시에는 try→ finally

 

사용자 정의 예외 클래스

기존의 예외 클래스를 상속 받아서 새로운 예외 클래스를 정의할 수 있음 ( 보통 Exception or RuntimeException 클래스를 상속 받음)