Java

TIL | Java - 예외처리

개발 공부 2022. 10. 19. 13:35

예외처리

예외란?

1. 컴파일 에러 : 문법적으로 틀린 에러
2. 런타임 에러 : 실행 에러

  • Errror : 심각한 에러 (프로그램내에서 처리할 수 있는 에러가 아님)
    ex) StackOverflowError 등
  • Exception : 미약한 에러 (프로그램 내에서 처리 가능한 에러)

예외처리란?

에러에 대한 처리, 사전에 에러가 발생할 때를 대비하여 처리 방안을 제시

주요 실행 에러(예외)

  1. NullPointerException (NPE) : 객체 참조가 없는 상태, 즉 null 값을 갖는 참조 변수
  2. ArrayIndexOutOfBoundsException : 배열에서 인덱스 범위를 초과하여 사용할 경우 발생
  3. NumberFormatException : 문자열로 되어 있는 데이터를 숫자로 변경하는 경우에 발생
  4. ClassCastException : 형변환은 부모클래스 - 자식클래스, 인터페이스 - 구현 클래스의 관계가 아니라면 다른 클래스로 타입을 변환할 수 없다.

외울 필요까지는 없다.

예외 처리 방법

1. try~ catch~ finally

  • try 블록 : 예외 발생 가능성이 있는 코드 작성
  • catch 블록 : 에러 발생시 처리 내용
    다중 catch 블록 작성 가능합니다.( 단, 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 합니다. 아래 예외 처리 클래스 상속 참고 )
  • finally 블록 : 에러이든 아니든 상관없이 실행되는 블록

❗️ 🔗 scan 무한루프 탈출하기

	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++;
		}
	}

2. throws : 예외 떠넘기기

  • 메서드 안에서의 예외처리
  • 메서드나 생성자를 호출한 곳으로 예외를 떠넘기는 코드
  • throws가 붙어있는 반드시 메서드는 try 블록 내부에서 호출되어야 한다.
  • throws가 있다면 "예외가 발생될 수 있는 코드이니 호출시 try catch로 묶어 사용하세요"라고 강요하는 코드
	//*** throws Exception과 try catch 구문의 차이!

	public ThrowsEx02_test() throws Exception{
		System.out.println("생성자 호출");
		aaa();
		System.out.println("생성자 종료");
	}
	
	public void aaa() throws Exception{
		System.out.println("aaa 시작");
		bbb(1);
		System.out.println("aaa 종료");
	}
	
	public void bbb(int i) throws Exception{
		System.out.println("bbb 시작");
		//*try {
		//	System.out.println(i/0);//예외
		//} catch (Exception e) {
		//	System.out.println("0으로 나눌 수 없습니다");
		//}
		System.out.println(i/0);
		System.out.println("bbb 종료");
	}
	}
	public static void main(String[] args) {
		//생성자에 대한 예외처리!
		try {
			ThrowsEx02 ex = new ThrowsEx02();
		} catch (Exception e) {
			System.out.println("0으로 나눌 수 없습니다");
			//e.printStackTrace();
		}
    }

3. throw : 예외 강제 발생 시키기

  • throw 구문은 강제 예외를 발생시키며 메서드를 종료한다.throws 예외 떠넘기기 구문으로 함께 처리한다.
public class TrowEx01 {
	public static void main(String[] args) {
		
		try {
			System.out.println(clac(10));
			System.out.println(clac(-10));
		} catch (Exception e) {
			e.printStackTrace(); //예외 내용을 로그로 출력해주는 기능
			System.out.println(e.getMessage()); //예외 생성시에 만들어진 메세지를 확인할 수 있음
		}
	}
	
	public static int clac(int n)throws Exception{
		if(n < 0) {
			throw new Exception("0이상으로 값을 전달하세요!!"); //예외 강제생성 -> 예외를 생성하면 예외처리 구문이 필요합니다.
			//예외 객체 생성
			//return; 반환값이 없기에 오류
		}
		int sum = 0;
		for(int i = 0; i <= n; i++){
			sum+=i;
		}
		return sum;
	}
}
//잘못된 값이 전달되면 예외를 만들어서 메서드를 강제종료하세요

🏁 QUIZ

	 * 1. 스캐너로 정수 2개를 입력받습니다.
	 * 2. 입력된 값이 정수라면 합계를 반환합니다.
	 * 3. 예외가 발생될 수 있는 상황이라면 throw를 이용해서 메서드를 종료하고 예외메세지를 전달해주시면 됩니다.
	 * 4. scan.close()는 finally 문장에서 사용하세요.
	public static int input() throws Exception{
		
		Scanner scan = null; //지역변수라 초기화 필요! / 멤버변수는 자동 초기화!
		try {
			scan = new Scanner(System.in);
			int num1 = scan.nextInt();
			int num2= scan.nextInt();
			return num1 + num2;
		} catch (Exception e) {
			throw new Exception("숫자로 입력하세요");//예외생성
		} finally {
			scan.close();
			//문제는 딱히 없지만 형식상 해주는게 좋다.
		}
	}