IT/JAVA

[DAY 14] 예외처리

_KH_ 2025. 1. 21. 00:10

[예외처리]

: 프로그램을 정상적으로 종료할 수 있게 or 프로그램을 끝까지 사용할 수 있게 코딩하는 것

 

예외 : 코드가 예상과 다른 라인에서 멈춰버리는 현상 or 프로그램이 갑자기 종료되어버리는 현상

             => 사용자 경험 저하

 

□ if문으로 처리할 수도 있지만 개발자가 알아보기 쉽도록 개발자용 문법을 사용해서 예외처리하도록 한다.

 

try {
      예외가 발생할 수 있는 코드 작성
}   
catch() {
        예외 발생 시 수행될 코드 작성
}
finally {
        예외 발생 여부와 무관하게 항상 수행되는 코드
}

 

□ ( ) 안에 해당 예외 클래스를 작성하면 그 예외를 잡을 수 있음

     -> 예외 발생 즉시 수행을 멈추고 catch로 이동

		int[] datas= {1,2,0,3,4};

		int a;
		int b;
		Scanner sc=new Scanner(System.in);

		try{
			System.out.println("정수를 2개 입력하세요.");
			System.out.print(">> ");
			a=sc.nextInt();
			System.out.print(">> ");
			b=sc.nextInt();

			int res=datas[a] / datas[b]; // 5 이상 입력 시 에러 발생
			System.out.println("답은 "+res);
		}		
		catch(ArithmeticException e) {
			System.out.println("0으로는 나누기 연산을 수행할수없습니다.");
		}
		catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("해당 인덱스는 없습니다.");
		}
		catch(Exception e) {
			e.printStackTrace();
		}
	}
}

 

■ Exception : 모든 예외 클래스들의 부모

catch(Exception e) {
printStackTrace(); 
} // 예외가 발생하는 이유를 알려주는 코드

- 예외 처리는 항상 위에서 아래로 내려오면서 수행하기 떄문에 최상위 클래스인 Exception을 가장 상단에서 수행하면 아래에 있는 예외처리에는 걸리지 않기에 에러가 발생함.

   -> 부모 클래스인 Exception을 하단에 작성할 것

 

※ 예외 목록 중 util 패키지에 있는 애들은 import !

※  InputMismatchException 예외처리 시 버퍼를 비우는 sc.nextLine();를 같이 사용하자. 

public class Test01 {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);	

		int num;
		while(true) {
			System.out.print("정수 입력 >> ");
			try {
				num = sc.nextInt();
				break; // while문의 종료조건! 짜피 올바른 수를 입력하면 catch를 만나지 않음.
			}	
			catch(InputMismatchException e) { // 그냥 얘 쓸 때는 sc.nextLine() 반드시 쓴다고 생각
				System.out.println("다시 입력!");
				// 버퍼를 비우지 않으면 무한루프에 걸림
				sc.nextLine();  // 버퍼에 남아있는 엔터??를 없애주는 코드..
			}

		}	
		System.out.println("num = " + num);
	}
}

 

※ 예외 처리 종류

1. 예외 일부러 발생시키기

2. 예외 만들기

3. 예외 미루기

 

■ 예외 미루기 : 실제로 예외가 발생한 곳에서 예외를 처리하는 것이 아니라 해당 함수(메서드, 객체)를 호출한 곳에서 예외를 처리하는 것

- "throws" 키워드 사용 (예외처리 강제 키워드)

// 인덱스 값을 주면 그 인덱스에 해당하는 값을 전달해주는 함수
	public static int kim(int index) throws Exception { // 예외 처리를 강제하는 키워드 (가져간 애한테)
		int[] datas = {11,22,33};
		return datas[index];
	}

	public static void main(String[] args) {
		int num = -1;
		try {
			num =kim(3); // 위에서 예외를 던지면 얘가 반드시 예외처리를 해줘야 함!!
		}
		catch(Exception e) {
			System.out.println("정확한 인덱스로 호출해야 합니다");	
		}
		System.out.println(num);
        	for(int i = 0; i<10; i++) {
			System.out.println("*");
			try {
				Thread.sleep(1000); // 1000당 1초
			}// .sleep()가 throws를 작성해둬서 오류
			// 자바에서 throws를 해둬서!!!!
			catch(InterruptedException e){
				e.printStackTrace(); 
			}
		}
	}
}

Thread.sleep(1000) 는 현재 스레드를 지정된 시간 동안 정지 상태로 만드는 기능을 하는데, 이 메서드가 사용되는 경우 InterruptedException이 발생할 가능성이 있어 예외 처리가 꼭 필요하다.