본문 바로가기
Java/기본 개념 및 클래스

[Java] 58. 예외 처리와 프로그램의 오류

글: Song hyun 2024. 4. 29.
728x90
반응형

[Java] 58. 예외 처리와 프로그램의 오류

1. 예외 처리 (Exception Handling) 란?

2. 예외 처리의 종류

(1) try-catch 문

(2) try-catch-finally 문

(3) Throws 문

(4) 사용자 정의 예외 클래스


 

1. 예외 처리(Exception Handling)

 예외 처리(Exception Handling)이란 프로그램 실행 중 발생할 수 있는 예상치 못한 상황을 관리하는 방법이다.

 

(1) 컴파일 에러와 런타임 에러: 에러에는 총 두 가지 종류가 있는데, 바로 컴파일 시점에서 발생한 컴파일 에러(Compile Error)와 코드 실행 시점에 일어난 런타임 에러(Runtime Error)이다. 이 런타임 에러는 다시 두 가지로 종류가 나뉘는데, 바로 에러와 예외이다. 

 

(2) 오류와 예외: 에러(Error)는 한번 발생하면 복구할 수 없는 심각한 오류이며, 보통 메모리 부족(OutOfMemory)이나, 스택오버플로우(StackOverFlow)같은 물리적인 문제에서 비롯된다. 반면 예외(Exception)은 수습이 가능하다는 점에서, 경중 역시 차이가 난다.

 

(3) Exception의 하위 클래스/RuntimeException의 하위 클래스: 아래를 보면 알 수 있듯, 최상위 클래스인 Object, Throwable 클래스, 그리고 그 아래에 Exception/Error 클래스로 나뉘어진다. Exception 클래스 내에서도 계층이 구분되는데, Exception의 하위 클래스들/ 그리고 Exception-RuntimeException의 하위 클래스들이다.

 

이런 Exception들은 사용자의 동작에 의해 발생할 때가 많은데, 이 예외들에 대비하기 위해 만들어진 것이 예외 처리(Exception Handling)이라고 할 수 있다. 예외 처리는 개발자로 하여금 많은 오류에 대비할 수 있게 해준다. 

*포트란, 파스칼과 같은 프로그래밍 언어는 예외 처리 기능이 없다.

 


2. 예외 처리의 종류

 

(1) try-catch/try-catch-finally문:

 try-catch-(finally)문의 형태는 아래와 같다.

예외가 발생할만한 코드를 작성후, 해당 코드 대신에 실행될 코드를 작성한다.

*finally문은 예외의 유무를 떠나, 언제나 실행되는 코드이기에 유용히 사용된다.

**예외가 발생하더라도, finally 블록을 실행해 자원을 닫을 수 있다.

try{ //예외가 발생할 가능성이 있는 코드
} catch (//특정 예외) { //특정 예외 발생시 실행할 코드
} finally { // finally문은 예외 발생과 상관없이 언제나 실행된다.
}

 

(3) Throws 문(=예외 던지기, 예외 전가):

예외 전가라고도 불린다. try-catch문 외에, 예외를 호출한 곳에 다시 예외를 던져버린다.

throw의 경우 사용자 정의 예외 처리와 함께 많이 쓰인다.

 

(4) 사용자 정의 예외 처리

-개발자가 직접 정의한 예외이다.

-사용자 정의 예외는 반드시 java.lang.Exception 클래스를 상속받아야 한다.
-사용자 정의 예외는 JVM에서 예외를 발생시켜주지 않는다.

 

package useful.ch03;

import java.util.Scanner;

public class FinallyHandling {
	public static void main(String[] args) {
		
		// try-catch-finally
		// 언제 finally를 사용해야해?
		// -> 자원을 반드시 닫아 주어야 할 때 등등.
		Scanner scanner=new Scanner(System.in);
		
		try {
			int result =scanner.nextInt();
			System.out.println("result : "+result);
			// scanner의 자원을 다 사용했다면, 자원을 해제해야 한다.	
		} finally {
			scanner.close();
			System.out.println("자원 해제 완료");
			// TODO: handle finally clause
		}
		
	}

}

 

 

 

package useful.ch03;

public class ThrowsHandling {
	// 메인 스레드
	public static void main(String[] args) {
		
		Calc calc=new Calc();
		try {
			// 던져서 강제성이 발생이 되고,
			// 사용하는 사람이 직접 예외 처리 핸들링을 할 수 있다.
			calc.divide(10,0);
		} catch (ArithmeticException e) {
			System.out.println("어떤 수를 0으로 나눌 수 없어요");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		Exception exception;
		
	} // end of main
} // end of class

class Calc{
	
	public int divide(int n1, int n2) throws Exception {
		// 사용자가 0입력하면 예외가 발생할 수 있는 코드 영역이다.
		// 해결 방법
		// 1. 해당 메서드에서 직접 예외 처리 구현
		// 2. 사용하는 사람이 직접 예외 처리를 할 수 있도록 던져버린다.
		return n1/n2;
	}
	
}

 

(4) 사용자 정의 예외 클래스

package useful.ch03;
/**
 * 사용자 정의 예외 클래스 생성
 */
public class PasswordException extends IllegalArgumentException {

	public PasswordException(String message) {
		super(message);
	}
	
}
package useful.ch03;

public class Password {
	
	private String pwd;
	
	// getter
	public String getPwd() {
		return this.pwd;
	}
	
	// setter
	public void setPwd(String pwd) throws PasswordException {
		if(pwd==null) {
			throw new PasswordException("비밀번호는 null값일 수 없습니다.");
		}
		if(pwd.length()<=5) {
			throw new PasswordException("비밀번호는 5자리 이상이어야 합니다.");
		}
		// 정규 표현식을 활용할 수 있다.
		// pwd<== a~z, A~Z ==> true
		// pwd<== a,10,! ==> false
		if(pwd.matches("[a-zA-Z]+")) {
			throw new PasswordException("비밀번호는 숫자나 특수 문자를 포함해야 합니다.");
		}
	}

}
package useful.ch03;

public class PasswordMainTest {
	// 스레드의 시작
	public static void main(String[] args) {
		
		Password password=new Password();
		String inputPwd="ade";
		
		// 테스트 해 보니, 아래 코드는 실행 시점에 예외가 발생되는 코드.
		// 해결 1. 직접 예외 처리
		// 해결 2. 던지기
		
		try {
			password.setPwd(inputPwd);
		} catch (PasswordException e) {
			System.out.println("우리가 정의한 password 예외가 발생");
		} catch (Exception e) {
			System.out.println("예외 발생 : "+e.getMessage());
		}
		
		
	} // end of main

} // end of class
728x90
반응형