본문 바로가기
Programming/Java

[JAVA] 예외 처리

by 공부합시다홍아 2023. 12. 1.
 

[JAVA] 인터페이스 (Interface)

[JAVA] Final 과 Abstract(추상화) [JAVA] SingleTon Design Pattern [JAVA] 정적 제한자 Static [JAVA] 다형성 [JAVA] 접근 제한자 [JAVA] 패키지와 상속 [JAVA] 객체와 클래스 [JAVA] 스택(Stack)과 큐(Queue) [JAVA] 매서드 [JAVA] 2

hong-study.tistory.com


예외 ( Exception )

예외에는 컴파일러 체크 예외실행 예외(Runtime Exception)가 있다. 

  • 컴파일러 체크 예외는 자바 소스를 컴파일하는 과정에서 예외 처리 코드를 검사하여 예외처리코드가 없다면
    컴파일 오류가 발생한다.
  • 실행 예외는 컴파일하는 과정에서 예외처리 코드를 검사하지 않는 예외를 말한다. 
예외 처리
▶ 에러에 대한 처리를 의미
▶ 자바는 예외처리 메커니즘을 제공
▶ 문제 발생 부분을 예상하여 사전에 경고하도록 코드를 작성하는 것을 예외처리라 한다. 

 

대표적인 실행 예외의 종류
  • NullPointerException
    객체 참조가 없는 상태, 즉 null 값을 갖는 참조변수로 객체 접근 연산자인 dot(.) 를 사용했을 때 발생
  • ArrayIndexOutOfBoundsException
    배열에서 인덱스 범위를 초과하여 사용할 경우 발생
  • NumberFormatException
    문자열로 되어있는 데이터를 숫자로 변경하는 경우에 발생
  • ClassCastException
    형 변환은 부모클래스와 자식클래스간에 발생하고 구현 클래스와 인터페이스 간에도 발생한다.
    이러한 관계가 아니라면 다른 클래스로 타입을 변환할 수 없다.

▶ ▶ ▶ 다만, 예외의 종류는 종류가 워낙많아 굳이 외우려고 할 필요는 없다.

public class RuntimeEx {

	public static void main(String[] args) {
		
		//Nullpointer
		String str = null;
		str.charAt(0);
		//ArrayIndexOut
		int[] arr = {1,2,3 };
		arr[4] = 100;
		
		//ClassCast
		//String str = (String)new Object();
		
		//NumberFormat
		int result = Integer.parseInt("hello world");

	}
}


예외 처리 방법 ( try ~ catch ~ finally )
  • try
    예외 발생 가능성이 있는 코드를 작성
    ▶ try 블록의 코드가 예외 발생 없이 정상 실행되면 catch 블록은 실행되지 않는다.
  • catch
    ▶ try 내부에서 예외가 발생하면 즉시 실행을 멈추고, catch 블록으로 이동하여 예외처리코드 실행
  • finally
    ▶ 예외 발생 여부와 상관없이 항상 실행할 내용이 있다면 사용
public class TrycatchEx01 {

	public static void main(String[] args) {
		
		int x = 10;
		int y = 0;
	
		try {
			
			System.out.println(x + y);
			
			System.out.println(x / y);
			
			System.out.println(x * y);
			
			
		} catch (Exception e) {
			System.out.println("0으로 나누지 마세요!");
		}

	}
}


public class TrycatchEx02 {

	public static void main(String[] args) {
		
		String[] arr = {"홍길동", "이순신", "피카츄"};
		
		
		int i = 0;
		while(i < 4) { 
			
			try {
				System.out.println(arr[i]);
				
			} catch (Exception e) {
				System.out.println("배열 범위를 벗어났습니다");
			} finally {
				System.out.println("이 문장은 예외 여부와 상관없이 무조건 실행됩니다");
			}
			
			i++;
		}
		
		System.out.println("프로그램 정상종료");
		
	}
}


다중 catch 
  • try 블록 내부는 다양한 종류의 예외가 발생할 수 있다.
    예외가 여러 가지 발생한다면 다중 catch 블록을 작성하여 예외를 처리한다.
  • catch 블록은 위에서부터 차례대로 검색되므로, 상위 예외 클래스의 catch 블록이 위에 있다면 
    하위 예외 클래스의 catch블록은 실행되지 않는다. 
  • catch() 괄호 안에 동일하게 처리하고 싶은 예외를 ' | ' 로 연결하면 된다. 
    ▶ 다만, 이 방식을 사용할 때는 상속관계가 있으면 안된다.

public class MultiTrycatchEx01 {

	public static void main(String[] args) {
    
		try {
			
			String a1 = args[0];
			String a2 = args[1];
			
			int a = Integer.parseInt(a1); //문자열을 숫자로 변경하는 기능
			int b = Integer.parseInt(a2);
			
			System.out.println("두 수의 합:"  + (a + b)  );
			
			String str = null;
			str.charAt(0);
			
		} catch (ArrayIndexOutOfBoundsException e) { //처리할 예외의 종류가 들어갑니다
			System.out.println("반드시 매개값을 2개 넣어주세요");
			e.printStackTrace();
		} catch (NumberFormatException | NullPointerException e ) {
			System.out.println("매개값을 숫자로 입력하세요");
		} catch (Exception e) {
			System.out.println("기타 예외 입니다");
		}

	}
}


예외처리의 상속 관계

Error 클래스를 상속하는 예외 클래스의 예외 상황은 시스템 오류 수준의 예외 상황으로 프로그램 내에서 
처리 할 수 있는 수준의 예외가 아니다, ( 심각한 에러 )
▷ Exception이 모든 예외를 처리할 수 있는 이유는 예외클래스들의 부모클래스 이기 때문이다.

예외처리 방법 1 - 예외 떠넘기기 ( throws )

throws 는 메서드나 생성자를 호출한 곳으로 예외를 떠넘기는 코드이다.
즉, 예외처리를 직접 수행하지 않고 메서드를 호출자에게 예외를 던지는 방법이다.

  • throws 키워드가 붙어있는 메서드는 반드시 try 블록 내부에서 호출
  • catch 블록에서 떠넘겨 받은 예외를 처리해야 한다.
  • main도 throws를 사용할 수 있다.
public class ThrowsEx02 {

	public ThrowsEx02() throws Exception {
		System.out.println("생성자 호출");
		aaa();
		System.out.println("생성자 종료");
	}
	
	public void aaa() throws Exception {
		System.out.println("aaa시작");
		bbb();
		System.out.println("aaa종료");
	}
	
	public void bbb() throws Exception {
		System.out.println("bbb시작");
		
		System.out.println(10 / 0); //exception
		
		System.out.println("bbb종료");
	}
	
}
public class MainClass {

	public static void main(String[] args) throws Exception {
	
		ThrowsEx02 ex = new ThrowsEx02();

	}
}


예외 강제 발생 시키기

사용자가 직접 선언한 예외 클래스나 자바가 제공하는 예외 API에서 예외를 강제 발생시키려면 throw 라는 키워드를 사용
>>> 예외를 강제 발생시키며 메서드를 강제 종료 시킨다.

public class ThrowEx01 {

	public static void main(String[] args) {
		
		/*
		 * throw - 예외 강제로 발생시키기
		 * 
		 * 메서드나 생성자에서 throw new 예외클래스()
		 * 를 만나면 예외가 생성됩니다.
		 * 
		 * throw키워드를 만나면 
		 * try~catch 문장이나 throws키워드로 예외처리를 진행해야 합니다.
		 * 
		 * throw특정 조건과 함께 catch문장으로 프로그램 실행을 옴길 때 사용가능합니다.
		 */
		try {

			int result = calc(-10);
			System.out.println(result);
			
		} catch (Exception e) {
			//System.out.println( e.getMessage() ); //예외 발생시 예외객체가 가지고 있는 메시지를 얻는 기능
			e.printStackTrace();
			//예외 경로를 추적하는 메시지를 출력하는 용도로 많이 사용됩니다.
			//예외 원인을 찾을 때, 개발시에 매번 사용됩니다.
		}
		
		System.out.println("프로그램 정상종료");

	}
	
	public static int calc(int n) throws Exception {
		
		//음수가 넘어오면 메서드 실행할 필요도 없이 강제종료
		if(n < 0) {
			throw new Exception("값을 양수로 전달하세요");
		}
			
		int sum = 0;
		for(int i = 1; i <= n; i++) {
			sum += i;
		}
		
		return sum;
	}

}


사용자 정의 예외

프로그램 개발하다보면 자바 표준 API에서 제공하는 예외 클래스만으로 다양한 종류의 예외를 표현 할 수 없다.

개발자가 만든 어플리케이션에서 자체적으로 생길 수 있는 예외는 개발자가 직접 예외처리를 해야한다.

  • 사용자 정의 예외 클래스는 Exception 클래스를 상속하여 사용하면 된다.
  • 사용자 정의 예외 클래스의 이름은 Exception으로 끝나는 것이 좋다.

728x90

'Programming > Java' 카테고리의 다른 글

[JAVA] API - java.util Package  (0) 2023.12.05
[JAVA] API ( java.lang package )  (0) 2023.12.04
[JAVA] 인터페이스 (Interface)  (0) 2023.11.30
[JAVA] Final 과 Abstract(추상화)  (0) 2023.11.30
[JAVA] SingleTon Design Pattern  (0) 2023.11.30