본문 바로가기
개발자/백엔드 웹 개발자 과정(국비)

2022년 12월 1일 _ 19회차 (Exception 예외)

by 초응 2022. 12. 1.

[Exception (예외)]

-예외 : 프로그램이 진행하는 과정에서 만나게 되는 오류(가벼운 정도의 에러)

 

-예외 처리 목적 

 : 프로그램이 진행할 때 일으킬 수 있는 상황등을 미리 정해놓고,

해당하는 예외가 발생했을 경우 그에 맞는 적절한

조치를 취해서 프로그램이 정상적으로 작동하도록 하기 위해서이다.

Exception 상속도

상속구조도를 항상 보는 습관을 가져야한다.

 

기능클래스 : Math 등등...

정보클래스 :Exception 

 

예외처리 방법

1. Handle 하는 방법 :  try~catch 구문 이용.

2. Declare 하는 방법 : throws 절을 선언하여 예외 전가.


try - catch : 예외 처리를 직접 구현하는 방법

try{
	예외가 발생할만한 코드
  }catch( 해당 Exception e){
  예외 일시 처리할 루틴
  }

 


하나의 try문과 여러 개의 catch문

 

try{
예외가 발생할 만한 코드
}catch(해당 Excetpion e1){
예외처리루틴1
}catch(해당 Excetpion e2){
예외처리루틴2
}catch(해당 Excetpion e2){
예외처리루틴3
}

ㄴ세부설정을 가지고 있는 자식부터 포괄적인 부모순으로 작성.

ㄴ만약 부모 Exception먼저 작성하고 자식을 작성한다면 데드코드로 뒤에 자식 코드 실행 안됨.

ㄴ예외처리를 로직의 일환으로 사용하지는 말 것.


package day19;

public class ExcepTest1 {

	public static void main(String[] args) {

			System.out.println("프로그램의 시작");
			
			//예외처리를 직접 구현을 하는 방법
			
			try {//에러가 날것 같은 부분 감싸기
				String str = null;
				
				System.out.println("str="+str.toString());
			}catch(NullPointerException e) { // 이 오류가 생겨 잡았다면 e에 넣어줘.
				System.out.println("사용할 객체가 존재하지 않음");
//				e.printStackTrace(); //어떤 코드가 나오는지 보여줌.
			//서비스를 상용할때는 삭제해야하는 테스트 코드임. 
			}
			
			//NullPointerException : 객체가 없는데 객체가 가지고 있는 기능을 쓰려고 했을때.
			
			
			System.out.println("프로그램의 끝");
	}

}
package day19;
//다중catch문
public class ExcepTest4 {

	public static void main(String[] args) {
		
		try {
			String data1 = args[0];
			String data2 = args[1];
	
			//명령줄 인수?
			System.out.println("첫번째 데이터:"+data1);
			System.out.println("두번째 데이터:"+data2);
			
			int num1 = Integer.parseInt(data1);
			int num2 = Integer.parseInt(data2);
			System.out.println(data1+"/"+data2+"="+(num1/num2));
			//레이더 (try)는 하나.
		}catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("프로그램 구동시 사용할 데이터를 입력해주세요.");
		}catch(NumberFormatException e) {
			System.out.println("입력할 데이터는 숫자여야만 합니다.");
		}catch(ArithmeticException e) {
			System.out.println("0으로는 나눌 수 없습니다.");
		}catch(Exception e) {
			System.out.println("고객센터 연락바람.");
		}
	}

}

NullPointerException : 객체가 없는데 객체가 가지고 있는 기능을 쓰려고 할때 나오는 오류.

ArrayIndexOutOfBoundsException : 범위에 없는 위치를 작성했을 경우 나오는 오류.

ArithmeticException : 산술예외로 0으로 나누려고 할때 나오는 오류.

e.printStackTrace(); //어떤 에러코드인지 보여줌, 실제 서비스 사용할때는 주석처리해야함.

 

 


[finally문]

try catch의 원형은 try~catch~finally 이다.

try ~catch 문에서 예외가 발생하거나 또는 발생하지 않더라도 반드시 실행해야하는 문장이 있을때 사용하는 구문.

자원을 쓰는 코드는 finally가 기본으로 들어간다.

자원 : 연결 정보의 객체 (예. system.in, BufferedReader등),자원을 쓸 때는 반환을 해줘야한다.

 

package day19;
import java.io.*;
public class ExcepTest5 {

	public static void main(String[] args) {
		
		BufferedReader br =
		new BufferedReader(new InputStreamReader(System.in));

		try {
			System.out.print("몇개의 데이터를 입력하시겠습니까?");
			int num = Integer.parseInt(br.readLine()) ;
			
			int arr[] = new int[num];
			
			for(int i=0;i<num;i++) {
				System.out.print((i+1)+"번째 데이터: ");
				arr[i] = Integer.parseInt(br.readLine()) ;
			}

			System.out.print("몇 번째 데이터를 확인하시겠습니까?");
			int user = Integer.parseInt(br.readLine()) ;
			System.out.println("선택한 값은:"+arr[user-1]);
			
						
					
		}catch(IOException e) {
			System.out.println("입출력 관련 예외 발생!");
		}catch(NumberFormatException e) {
			System.out.println("숫자만을 입력하셔야 합니다.");
		}catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("존재하지 않는 위치입니다.");
		}catch(NegativeArraySizeException e) {
			System.out.println("저장공간의 크기는 항상 양수여야합니다.");
		}catch(Exception e) {
			System.out.println("고객센터 연락바람~");
		}finally {
			try {
				br.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	
	}
}

try~catch~finally( try~catch) // finally를 사용하여 나올 수 있는 예외처리 한번더 해주기.

 


[예외 처리 미루기]

메소드 내부에서 예외를 직접 처리하지 않고 메소드를 호출한 곳으로 예외처리를 미루는 방법.

 

*사용자 정의 예외

throws  예외객체  // 전가(나를 호출한 녀석에게 전가함)

throw  new 예외클래스(전달인자); //  발생

 

package day19;

import java.io.*;

class AAA{
	public void aaa() {

			throw new NullPointerException();
			//RuntimeException 계열 예외들은 throws를 안해줘도 jvm이 알아서 throws를 해주므로 생략해도됨
	}
}

class BBB{
	public void bbb() { // throws : 나를 호출한 녀석에게 전가 
		AAA a =new AAA();
		a.aaa();
	}
}

public class ThrowsTest {

	public static void main(String[] args) {

		BBB b = new BBB();
		b.bbb();
	}

}

RuntimeException 계열 예외들은 throws를 안해줘도 jvm이 알아서 throws를 해주므로 생략해도된다.