[Java] - 예외처리

이창희·2022년 6월 21일
0

Java

목록 보기
11/13
post-thumbnail

예외처리

1. 프로그램 오류

  • 컴파일 에러 : 컴파일 할 때 발생하는 에러
  • 런타임 에러 : 실행 할 때 발생하는 에러
  • 논리적 에러 : 작성 의도와 다르게 동작할 때 발생하는 에러

에러와 예외(Error & Exception)

  • 에러 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
  • 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
에러가 발생하면 프로그램의 비정상적인 종료를 막을 수 없지만, 예외는 발생하더라도 프로그래머가 이에 대한 적절한 코드를 미리 작성해 놓음으로써 프로그램의 비정상적인 종료를 막을 수 있다.

2. 예외 클래스의 계층구조

Exception과 RuntimeException

Exception 클래스들 : 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외

RuntimeException클래스들 : 프로그래머의 실수로 발생하는 예외

Exception의 계층구조

  • IOException : 입출력 관련 오류
  • ClassNotFoundException : 클래스 존재관련 오류
  • RuntimeException : 실행중 오류
    • ArithmeticException : 산술계산 오류
    • ClassCastException : 형변환 오류
    • NullPointException : Null포인터 오류
    • IndexOutOfBoundsException : 배열의 범위를 벗어나는 오류

3. 예외처리하기 try-catch문

예외처리의 정의와 목적

정의: 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것

목적 : 프로그램의 비정상 종료를 막고 정상적인 실행상태를 유지하는 것

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

try-catch문에서의 흐름

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

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

PrintStackTrace()와 getMessage()

printStackTrace() : 예외발생 당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.

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

try{
	Sysyem.out.println(0/0); 예외 발생!!!
}
	catch(ArithmeticException e){
	  e.printStackTrace(); // ArithmeticException 에외메시지 출력
	System.out.println("예외메시지:" +e.getMessage());
}

4. 예외 발생시키기

  1. 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음

    Exception e = new Exception("고의로 발생시킴");

  2. 키워드 throw를 이요해서 예외를 발생시킨다.

    throw e;

    public class ExceptionEx {
    	public static void main(String[] args) {
    		try {
    			Exception e = new Exception("고의로 발생시켰음");
    			throw e;
    			// throw new Exception("고의로 발생시켰음");
    			
    		} catch (Exception e) {
    			System.out.println("에러메시지 : " + e.getMessage());
    			e.printStackTrace();
    		}
    		System.out.println("프로그램이 정상 종료되었음");
    	}
    }

5. 메서드에 예외 선언하기

  • 예외를 처리하는 방법: try-catch문(직접), 예외 선언하기(넘기기)
  • 메서드가 호출시 발생가능한 예외를 호출하는 쪽에 알리는 것

예외를 발생시키는 키워드 throw와 예외를 메서드에 선언할 때 쓰이는 throws를 잘 구별하자

public class Ex8_9 {
    public static void main(String[] args) throws Exception {
        method1();
    }
    static void method1() throws Exception{
        method2();
    }
    static void method2() throws Exception{
        throw new Exception();
    }
}

예외를 메서드의 throws에 명시하는 것은 예외를 처리하는 것이 아니라, 자신을 호출한 메서드에게 예외를 전달하여 예외처리를 떠맡기는 것이다.

제일 마지막에 있는 main메서드에서도 예외가 처리되지 않으면, main메서드마저 종료되어 프로그램이 전체가 종료된다.

6. finally블럭

사용목적: 예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적

  • try-catch-finally순으로 구성된다.
try{
        // 예외가 발생할 수 도 있는 문장
  }catch(Exception e1){
        //예외처리를 위한 문장
  }finally{
     //예외의 발생여부와 상관없이 항상 수행되어야할 문장들을 넣는다.
     //제일 마지막에 finally가 와야한다.
}

7. 사용자정의 예외 만들기

기존의 정의된 예외 클래스 외에 필요에 따라 프로그래머가 새로운 예외 클래스를 정의하여 사용할 수 있다.

profile
백앤드 개발자를 꿈꾸는 개발자 지망생입니다.

0개의 댓글