BackEnd/Java

[Java]예외처리(Exception) throw와 throws 구분하기

Hojung7 2024. 8. 12. 14:40
1. throws란? 

 

메서드 내부에서 던져진 예외를 호출부로 다시 던지는 예외 처리 구문

 

2.  throw란?

 

생성된 예외 객체를 던져 예외 발생!

 (예외 강제 발생)

 

[throws를 사용하는 이유!!!]

 

1) 경고의 의미

 

-> 해당 메서드 기능을 활용하다보면

 특정 예외가 발생할 수도 있으니 대비를 해라

 

 2) 예외 처리를 한 곳에서 묶어 처리하기 위하여

 

 -> 실질적으로 예외를 처리하는 try - catch 구문이

사방에 흩어져 있을 경우 돌려 받는 최종 결과가

정상 결과인지, 예외 처리된 결과인지 구분

하기 힘들어지는 경우가 발생

 

#예제1

package pkg3.service;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.InputMismatchException;
import java.util.Scanner;

public class ThrowsService {
	
	
	// 스캐너 객체 생성
	private Scanner sc = new Scanner(System.in);
	
	
	
	public void test1() {
		
		// test1()에서 test2() 호출
		// -> (3) test2() 메서드에서 던져진 예외를 처리해야함!!
		try {
			test2();
			
		}catch(Exception e) {
			// (4) test2()에서 던져진 예외를 잡아서 처리
			e.printStackTrace(); // 예외가 발생한 원인, 메서드 추적
		}
	}
	
				
	public void test2() throws Exception{
		//(2) throws Exception
		// -> 메서드 내부에서 발생한
		//    Exception 또는 Exception 자식 예외를
		///   메서드 호출한 곳으로 다시 던짐!!
		
		
		//(1) Exception 강제 발생
		throw new Exception();
	}

 

[run]

package pkg3.run;

import java.io.IOException;

import pkg3.service.ThrowsService;

public class ThrowsRun {
	public static void main(String[] args) throws IOException {
		ThrowsService service = new ThrowsService();
		
//		service.test1();
		
		// 빨간줄이 뜨는 이유
		// -> test3() 에서 IOException이 던져져 올 수도 있기 때문에
		// 대비(예외 처리)를 해야되는데 안해서
		
		// -> main() 메서드에 throws를 작성해서 또 예외를 전달
		// 하지만...
		// main()을 호출한 메서드는 존재하지 않기 때문에
		// "예외가 처리되지 않아" 프로그램 강제 종료됨
//		service.test3();
		
//	    System.out.println("와아아아");

 

#예제2

[service]

	public void test5() {
		
		int input = 0;
		
		do {
			System.out.println("--- 예외 처리 테스트 ---");
			System.out.println("1. 나누기(0으로 나누면 오류 발생) ");
			System.out.println("2. 강제로 Exception 던지기");
			System.out.println("3. 효율적인 키보드 문자열 입력 코드");
			System.out.println("0. 종료");
			
			try {
				System.out.print(" 메뉴 선택 ::::: ");
				
				// 정수 아닌 값 입력하면 예외 발생
				input = sc.nextInt(); 
				sc.nextLine();
				
				
				switch(input) {
				case 1 : divNum();  break;
				case 2 : forcedException(); break;
				
				case 3 : inputKeyboard();  break;
				
				case 0 : System.out.println("*** 종료 ***"); break;
				
				default : System.out.println("*** 잘못 입력 ***");
				}
				
				
			} catch(InputMismatchException e) {
				System.out.println("*** 정수만 입력해 주세요 ***");
				
				sc.nextLine(); // 입력 버퍼에 남은 문자열 제거!!
				
				input = -1; // 첫 반복 시
				// 반복문이 종료되지 않도록 input 값을 변경
			
			} catch(ArithmeticException e) {
				System.out.println("***** 발생한 산술적 예외를 test5()에서 처리 *****");
			
			} catch(Exception e) { // 다형성 (업 캐스팅) 적용 가능
				// Excpetion / IOException 2개 처리
				
				System.out.println("**** Exception 또는 남은 예외 처리 *****");
			}
			
			
		}while(input != 0);
		
	}
	
	
						 // 컴파일러가 미작성 시 추가
	public void divNum() /* throws RuntimeException */{
		
		System.out.print("정수 입력 1 : ");
		int num1 = sc.nextInt();
		
		System.out.print("정수 입력 2 : ");
		int num2 = sc.nextInt();
		
		
		System.out.println("몫 : " + (num1 / num2));
		
		// num2가 0인 경우
		// ArithmeticException (산술적 예외) 발생 가능성이 있다!
		// -> 근데 왜 빨간줄이 안뜨지??
		//   "Unchecked Exception" 이라서 빨간줄이 안뜬다!!!
		
		// ArithmeticException 발생하면
		// 호출한 곳으로 예외를 던지는 throws 사용!!!
		
		// *** Unchecked Exception은
		//    아무런 예외처리가 안되어 있는 경우
		//    컴파일러가 자동으로 throws 구문을 생성해준다!! ***
	}
	
	/**
	 * 강제로 Exception 발생 시켜서 던지기!!!
	 * @throws Exception
	 */
	public void forcedException() throws Exception{
		throw new Exception();
	}
	
	
	/**
	 * 효율적인 키보드 입력
	 * - Scanner가 아닌 다른 방법
	 * 
	 * @throws IOException : 키보드 입력 시 발생할 수 있는 문제를 던짐
	 */
	public void inputKeyboard() throws IOException{
		
		BufferedReader br 
			= new BufferedReader(new InputStreamReader(System.in));
		
		// System.in : 키보드 입력(바이트 형식)
		// InputStreamReader : 읽어온 바이트를 문자로 변경하는 통로
		// BufferedReader : 버퍼에 모여있는 내용을 한 번에 읽어옴
		
		// -> 입력된 키보드 값을 문자로 변경하여 버퍼에 모은 후
		//    한 방에 읽어오는 객체를 생성함
		
		System.out.print("문자열 입력 : ");
		
		String str = br.readLine();
		
		// br.readLine() : 입력된 한 줄을 통째로 읽어옴
		// -> readLine() 메서드는 IOExcepion을 던질 가능성이 있으므로
		//    예외 처리 구문을 "꼭" 작성해 예외 상황에 대비
		
		System.out.println("입력된 값 : " + str);
		
	}
	
	
	
}

 

#결과