예외처리

woom·2022년 11월 16일
0

JAVA

목록 보기
11/18
post-thumbnail

🌼 예외(Exception)

  • 사용자에 의해 프로그램을 잘못 실행하거나 프로그램을 잘못 개발되어 실행된 경우 발생되는 프로그램 오류
  • 예외가 발생된 경우 예외가 발생된 지점에서 프로그램 강제 종료
  • 예외가 발생되어 프로그램이 종료되는 것을 방지하거나 프로그램이 강제로 종료된 이유를 알기 위해 예외 처리 필요
  • 예외를 처리하기 위해 Java에서는 다양한 예외클래스(Exception Class)를 제공
  • 예외클래스 : 예외 관련 정보를 저장하기 위한 클래스
    • Exception 클래스를 상속받아 작성된 자식클래스
  • Throwable 클래스 : 프로그램에서 발생되는 모든 오류정보를 저장하기 위한 부모클래스
    • 자식클래스 : Error 클래스, Exception 클래스
    • Throwable.getMessage() : 예외 객체에 저장된 예외 메세지를 문자열로 반환하는 메소드
    • Throwable.printStackTrace() : 예외가 발생된 경로를 역추적하여 상세한 정보를 제공받아 출력하는 메소드

📌 예외클래스 분류

  1. 일반 예외 : RuntimeException 클래스를 상속받지 않는 예외클래스로 예외처리

    • 프로그램 실행시 예외가 발생될 수 있는 가능성이 높아 컴파일시 예외처리하지 않으면 에러 발생
  2. 실행 예외 : RuntimeException 클래스를 상속받는 예외클래스로 예외처리

    • 프로그램 실행시 예외가 발생될 수 있는 가능성이 낮아 컴파일시 예외처리 불필요
    • 예외가 발생된 경우 JVM에서 자동으로 예외처리를 하여 예외메세지 제공

🌼 예외처리 방법

  • try ~ catch 구문 사용

  • 형식)
    try {
    예외가 발생될 수 있는 명령;
    ...
    } catch (예외클래스 참조변수 e ) {
    예외처리 명령;
    ...
    } finally {
    예외에 상관없이 무조건 실행될 명령;
    }

    • try 블럭에서 예외가 발생될 경우 JVM이 예외클래스로 객체 생성
    • try 블럭에서 발생된 예외 관련 객체를 catch 블럭으로 전달받아 참조변수에 저장
    • catch 블럭의 참조변수에 저장된 예외 관련 객체를 이용하여 예외처리 명령 작성
    • try 블럭에서 예외가 발생되면 프로그램을 종료하지 않고 프로그램의 흐름(스레드)이 catch 블럭으로 이동
    • catch 블럭은 여러개 작성 가능 (다양한 예외를 구분하여 예외처리 가능)
    • finally 블럭에는 예외와 상관없이 무조건 실행될 명령 작성 (사용 자원에 대한 제거 명령 실행 : 생략 가능)
  • 예외가 발생된 명령에서 발생된 예외를 메소드를 이용하여 전달 가능

    • 형식) 접근제한자 반환형 메소드명(자료형 매개변수,...) throws 예외클래스,예외클래스,... { }
  • 메소드에서 발생된 모든 예외를 Exception 클래스(모든 예외클래스의 부모클래스) 하나로 전달 가능

  • 인위적으로 예외 객체를 생성하여 예외를 발생시키는 명령

    • 프로그램의 흐름이 catch 블럭으로 이동하여 명령 실행
    • 형식) throw new 예외클래스(String message);

🐣 예제1 (try ~ catch)

  • 배열 요소의 첨자 사용시 범위를 벗어난 경우 ArrayIndexOutOfBoundsException 발생
    • JVM에 의해 ArrayIndexOutOfBoundsException 객체 생성
    • 실행 예외이므로 컴파일시 예외처리 되어 있지 않아도 에러 미발생
    • 실행 예외는 예외 발생시 JVM에 의해 자동으로 예외처리되어 메세지를 제공받아 출력 (개발자 중심)
    • 사용자 중심의 프로그램을 작성하기 위해 직접 예외처리 하는 것을 권장

public class ExceptionHandleApp {
	public static void main(String[] args) {
		int[] array={10,20,30,40,50};
		
		try {
			for(int i=0;i<=array.length;i++) {
				System.out.println("array["+i+"] = "+array[i]);
			}
			//예외가 발생된 경우 예외 발생 명령 하단에 존재하는 명령 미실행
			//예외 발생된 경우 프로그램은 강제 종료 or catch 블럭으로 이동 
			System.out.println("[메세지]프로그램이 정상적으로 실행");
            
		} catch (ArrayIndexOutOfBoundsException e) {
			//프로그램 사용자에게는 예외 관련 메세지 출력 (생략 가능)
			System.out.println("[에러]프로그램 실행에 오류가 발생");
			
			//프로그램 개발자에게는 예외 관련 메세지를 기록하여 전달 (에러 로그:필수)
			//예외 객체를 전달받아 참조변수에 저장하여 예외처리시 사용
			//Throwable.getMessage() : 예외 메세지를 문자열로 반환하는 메소드
			System.out.println("[예외]"+e.getMessage());
		
			e.printStackTrace();
            //예외가 발생된 경로를 역추적하여 발생된 상세정보를 제공받아 출력하는 메소드
            
		} finally {//생략 가능
			System.out.println("[메세지]예외와 상관없이 무조건 실행되는 명령"); }}}





🐣 예제2 (throws)

  • 예외가 발생된 명령에서 예외처리하지 않고 발생된 예외를 메소드를 이용하여 전달 가능
    • 형식) 접근제한자 반환형 메소드명(자료형 매개변수,...) throws 예외클래스,예외클래스,... { }
    • 메소드 명령에서 발생된 예외를 메소드를 호출하는 명령으로 전달하는 방법

public class ExceptionThrowsApp {
	public static void display() throws ArrayIndexOutOfBoundsException {
		int[] array={10,20,30,40,50};
		
		for(int i=0;i<=array.length;i++) {
			System.out.println("array["+i+"] = "+array[i]); }}
	
	public static void main(String[] args) {
		try {
			//정적메소드는 클래스 이름을 이용하여 호출 
			//같은 클래스에 선언된 정적메소드는 클래스 표현 없이 메소드 호출 가능
			display();
			//일반 예외시 컴파일 에러가 발생되고 실행 예외시 JVM에 의해 자동으로 예외처리
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("[에러]프로그램 실행에 오류 발생"); }}}





🐣 예제3 (exception)

  • 키보드로 정수값 2개를 입력받아 첫번째 정수값으로 두번째 정수값을 나눈 몫을 계산하여 출력하는 프로그램 작성

  • 메소드에서 발생된 모든 예외를 Exception 클래스 하나로 전달 가능

    • Exception : 모든 예외클래스의 부모클래스
  • catch 블럭에서 예외클래스를 | 연산자로 연결하여 다수의 예외에 대한 처리 가능


public class CalcApp {
	public CalcApp() throws InputMismatchException, ArithmeticException {
	//public CalcApp() throws Exception {
    //메소드에서 발생된 모든 예외를 Exception 클래스 하나로 전달 가능
		Scanner scanner=new Scanner(System.in);
		
		System.out.print("첫번째 정수값 입력 >> ");
		//Scanner.nextInt() : 입력값을 정수값으로 변환하여 반환하는 메소드
		//입력값이 정수값으로 변환되지 못할 경우 InputMismatchException 발생
		// → 직접 예외처리하지 않고 메소드를 사용하여 발생 예외 전달 가능 
		int num1=scanner.nextInt();
		
		System.out.print("두번째 정수값 입력 >> ");
		int num2=scanner.nextInt();
		
		//어떤수를 0으로 나눈 경우 ArithmeticException 발생
		System.out.println("[결과]"+num1+" / "+num2+" = "+(num1/num2));
		
		scanner.close(); 
	}
	public static void main(String[] args) {
		try {
			//생성자를 이용하여 객체 생성 (생성자의 명령 실행) 
			// → 예외가 전달된 메소드 호출 - 예외처리
			new CalcApp();
		} catch (InputMismatchException e) {
			System.out.println("[에러]정수값만 입력 가능합니다.");
		} catch (ArithmeticException e) {
			System.out.println("[에러]0으로 나눌수 없습니다.");
		} catch (Exception e) {
			//모든 예외 객체를 전달받아 참조변수에 저장하여 예외처리 가능
			System.out.println("[에러]프로그램에 오류 발생");}
		
		try {
			new CalcApp();
		} catch (InputMismatchException | ArithmeticException e) {
			//catch 블럭에서 예외클래스를 | 연산자로 연결하여 다수의 예외 처리 가능
			System.out.println("[에러]형식에 맞는 값을 입력해 주세요.");
		} catch (Exception e) {	
			System.out.println("[에러]프로그램에 오류가 발생"); }}}





🐣 예제4 (예외 객체 생성)

  • 키보드로 정수값을 입력받아 저장된 비밀번호와 비교하여 비교결과를 출력하는 프로그램 작성
  • 인위적으로 예외 객체를 생성하여 예외를 발생시키는 명령
    • 프로그램의 흐름이 catch 블럭으로 이동하여 명령 실행
    • 형식) throw new 예외클래스(String message);
public class PasswordMatchApp {
	public static void main(String[] args) {
    
		Scanner scanner=new Scanner(System.in);
		try {
			System.out.print("비밀번호 입력 >> ");
			int password=scanner.nextInt();//InputMismatchException 발생 가능
			
			if(password!=123456) {
            	//인위적으로 예외 객체를 생성하여 예외를 발생시키는 명령
				throw new PasswordMismatchException("입력된 비밀번호가 다릅니다.");
			}
			
			//인위적 예외가 발생되지 않을 경우 실행되는 명령 
			System.out.println("[결과]입력된 비밀번호가 맞습니다.");
		} catch (InputMismatchException e) {
			System.out.println("[에러]숫자만 입력 가능합니다.");
		} catch (PasswordMismatchException e) {
			System.out.println(e.getMessage());
		} finally {
			scanner.close(); }}}





🐣 예제5 (예외클래스 선언)

  • 프로그램 개발자가 직접 선언한 예외클래스
    • 반드시 Exception 클래스를 상속받아 작성

public class PasswordMismatchException extends Exception {
	private static final long serialVersionUID = 1L;

	public PasswordMismatchException() { }//기본생성자
	
	public PasswordMismatchException(String message) {
		//Exception 클래스에는 예외 메세지를 저장하기 위한 필드 선언
		//super 키워드를 사용하여 Exception 클래스의 필드에 초기값(예외 메세지) 저장
		super(message); }}





profile
Study Log 📂

0개의 댓글

관련 채용 정보