Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

나의 IT일지

예외 떠넘기기 본문

프로그래밍 언어/Java

예외 떠넘기기

세레프 2023. 5. 6. 05:28

 프로그램을 실행을 하다가 오류가 발생하는 경우가 있는데, 하드웨어로 인한 오류인 에러와 프로그램 자체에서 발생하는 오류인 예외가 있다.

  • 에러 : 개발자가 조치를 취할 수 없는 수준 ex)메모리 부족, JVM동작 이상
  • 컴파일 에러 : 컴파일 시 발생하는 에러 ex)오타, 잘못된 자료형
  • 런타임 에러 : 프로그램 실행 도중에 발생하는 에러
  • 로직 에러 : 실행은 되지만 의도와는 다르게 동작하는 에러
  • 예외 : 다른방식으로 처리가능한 오류 ex)입력값 오류

 이처럼 하드웨어의 오작동이나 고장으로 인한 오류, 잘못된 코딩, 잘못된 입력으로 인해 발생하는 오류가 있는데, 발생하는 오류 중에서 프로그램 실행하는 중에 처리가 가능한 오류를 예외라고 한다.

 예외 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 오류로, java.lang.Exception클래스를 통해 오류가 관리 된다.

 

예외 처리

프로그램을 실행을 하다가 하드웨어의 오작동이나 고장으로 인한 오류, 잘못된 코딩, 잘못된 입력으로 인해 발생하는 오류가 발생하는 경우가 있는데, 발생하는 오류 중에서 잘못된 코딩, 잘못

my-it-diary.tistory.com

예외 설명
ArithmeticException 실행 중에 수학적으로 오류가 발생하는 경우
ArrayIndwxOutOfBoundsException 실행 중에 배열에서 인덱스 범위를 초과하는 경우
NullPointerException 실행 중에 참조변수의 값이 NULL인 상태에서 객체 접근 연산자를 사용하는 경우

 

 프로그램을 실행하는 도중에 예외가 발생하는 경우, JVM에서 해당 예외 클래스를 통해 객체를 생성해서, 예외 처리 코드에서 해당 예외 객체를 통해 예외 발생 여부를 확인한다.

 예외처리 예외가 발생했을 때 프로그램이 비정상적으로 종료되는 것을 막는 방법으로, 컴파일할 때 일반 예외가 발생할 가능성이 있는 코드를 발견할 경우, 컴파일 에러를 발생시켜 개발자가 강제적으로 예외처리코드를 작성하도록 유도하며, 실행 예외가 발생할 가능성이 있는 코드일 경우, 컴파일러는 체크하지 않기에 경험을 바탕으로 예외처리코드를 작성해야 한다.

 예외 종류 설명
일반 예외  프로그램 실행 시 예외 발생의 예측이 가능하기 때문에, 컴파일과정에서 해당 예외 처리 코드가 있는 지 검사하며, 예외 처리 코드가 없을경우 컴파일 에러가 발생한다. (컴파일러 체크 예외)
실행 예외  프로그램 실행 시 예측이 불가능하여 갑자기 발생하기에, 컴파일 과정에서 예외 처리 코드가 있는지 검사하지 않는다. (컴파일러 none 체크 예외)

 

예외 넘기기(throws)

 메서드 내에서 예외가 발생하는 경우, 개발자가 인지할 수 있도록 메서드를 호출한 곳으로 예외를 떠넘기는 경우가 있다. 이때 사용하는 키워드가 "throws"로, 예외가 발생하는 메서드의 선언부 끝에 작성해서 메서드에서 처리하지 않은 예외를 메서드를 호출하는 곳으로 떠넘긴다. 

예외 처리 메서드
try{
    예외가 발생할 수 있는 메서드
}
catch(Exception e){
    예외 발생시 처리할 명령;
}
타입명 메서드명() throws 예외 클래스 { 



}

 보통은 발생을 예상한 예외클래스를 종류별로 나열하지만, Exception을 통해 모든 예외 클래스를 간단히 떠넘길 수 있다. 

package pack0506;

public class Code2 {

	public static void main(String[] args) {
		try {
			methodC();
		}
		catch(Exception e){
			System.out.println("메인에서 처리");
		}

	}
	public static void methodC() throws Exception{
		Exception e = new Exception();
		throw e;
	}
}

 위의 코드를 보면 "throw"명령어를 통해 의도적으로 예외를 발생시켜, 예외 처리문에서 처리하는 것을 확인할 수 있다. 즉, throws 키워드가 있는 메서드는  반드시 try 블록에서 호출해야 하며, catch 블록에서 넘겨받은 에외를 처리한다.

 

 추가적으로, 메서드 마다 "throws"를 사용함으로써, 여러 메서드를 경유해서 예외를 떠넘기는 경우가 있다. 

package pack0506;

public class Code2 {

	public static void main(String[] args) {
		try {
			methodA();
		}
		catch(Exception e){
			System.out.println("메인에서 처리");
		}

	}
	public static void methodA() throws Exception{
		methodB();
	}
	public static void methodB() throws Exception{
		methodC();
	}		
	public static void methodC() throws Exception{
		Exception e = new Exception();
		throw e;
}
}

 즉, methodC()에서 throw를 통해 강제로 예외를 발생시키며, throws키워드를 통해 호출한 곳인 methodB()로 떠넘긴다. 그리고 methodB에서도 throws키워드를 통해 호출한 곳인 methodA()로 떠넘기며, methodA에서도 throws키워드를 통해 호출한 곳에서 try-catch블록을 사용해서 예외처리를 한다.

throw 명령어
 프로그래머가 고의로 예외를 발생시킬 때 사용하는 명령어로, "throw new Exception" 또는 "throw "Exception"클래스를 통한 객체를 가진 참조변수"를 통해 Exception클래스의 객체나 Exception클래스의 객체의 주소를 가지는 참조변수에 오류를 발생시킨다. 

 

'프로그래밍 언어 > Java' 카테고리의 다른 글

String클래스, StringBuffer클래스  (0) 2023.05.12
API와 Object 클래스  (0) 2023.05.11
예외 처리  (0) 2023.05.05
익명 객체  (0) 2023.05.03
중첩 클래스  (0) 2023.05.02
Comments