혼자 공부하는 자바 - 10장. 예외 처리

youngtae·2023년 4월 10일
0

자바 이론

목록 보기
9/12
post-thumbnail

예외 클래스

예외와 예외 클래스

  • 예외에는 일반 예외와 실행 예외가 있음
    • 일반 예외 : 컴파일러 체크 예외
      프로그램 실행 시 예외 발생 가능성이 높아서 컴파일 과정에서 검사
    • 실행 예외 : 컴파일러 논 체크 예외
      실행 시 예측할 수 없이 갑자기 발생
  • 자바에서는 예외를 클래스로 관리
  • JVM 프로그램 실행 도중에 예외가 발생하면 해당 예외 클래스로 객체 생성
  • 모든 예외 클래스는 java.lang.Exception 클래스 상속 받음
  • RuntimeException의 하위 클래스가 아니면 일반 예외 클래스, 하위클래스라면 실행 예외 클래스

실행 예외

  • 실행 예외는 컴파일러가 체크하지 않기 때문에 직접 예외 처리 코드 작성해야함

NullPointerException

  • 자바에서 가장 빈번하게 발생하는 실행예외
  • 객체 참조가 없는 상태, 즉 null 값을 갖는 참조 변수로 접근 연산자(.) 사용했을 때 발생
public class NullPointer {
	public static void main(String[] args) {
		String data = null;
		System.out.println(data.toString());
	}
}
// data 변수가 null값 가지고 있기 때문에 Sting객체 참조하지 않음
// 이 상태에서 메서드 호출 시 에러 발생

ArrayIndexOutOfBoundsException

  • 배열에서 인덱스 범위 초과할 경우 발생
public class ArrayIndexOutOfBoundsExceptionExample {
	public static void main(String[] args) {
		String data1 = args[0];
		// 실행 매개값을 주지 않아서 에러 발
		String data2 = args[1];
		
		System.out.println("args[0]: " + data1);
		System.out.println("args[1]: " + data2);
	}
}

NumberFormatException

  • 문자열이 숫자로 변환될 수 없을 때 발생
public class NumberFormatExceptionExample {
	public static void main(String[] args) {
		String data1 = "100";
		String data2 = "a100";
				
		int value1 = Integer.parseInt(data1); // 변환 성공
		int value2 = Integer.parseInt(data2); // 에러 발
		
		int result = value1 + value2;
		System.out.println(data1 + "+" + data2 + "=" + result);
	}
}

ClassCastException

  • 클래스 타입 변환 할 수 없을 때 발생
  • instanceof 연산자로 타입 변환 가능한지 확인하는 것이 좋음
public class ClassCastExceptionExample {
	public static void main(String[] args) {
		Dog dog = new Dog();
		changeDog(dog);
		
		Cat cat = new Cat();
		changeDog(cat);
	}
	
	public static void changeDog(Animal animal) {
		//if(animal instanceof Dog) {
			Dog dog = (Dog) animal; 	//ClassCastException 발생 가능
		//} 
	}
}

class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}

예외 처리

예외 처리 코드

  • try-catch-finally
try {

예외 발생 가능 코드

} catch(예외클래스 e) {

예외 처리  // 예외 발생시 실행

} finally {

항상 실행;
// 위에서 return문 사용하더라도 항상 실행
}

예외 종류에 따른 처리 코드

다중 catch

  • 예외별로 처리 코드를 다르게 실행
  • 상위 예외 클래스가 하위 예외 클래스 아래에 위치 해야함!
public class CatchByExceptionKindExample {
	public static void main(String[] args) {
		try {
			String data1 = args[0];
			String data2 = args[1];
			int value1 = Integer.parseInt(data1);
			int value2 = Integer.parseInt(data2);
			int result = value1 + value2;
			System.out.println(data1 + "+" + data2 + "=" + result);
		} catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("실행 매개값의 수가 부족합니다.");
		} catch(NumberFormatException e) {
			System.out.println("숫자로 변환할 수 없습니다.");
		} finally {
			System.out.println("다시 실행하세요.");
		}
	}
}

예외 떠넘기기

  • throws : 메서드에서 처리하지 않은 예외를 호출한 곳으로 떠넘김
  • throws 키워드가 붙어 있는 메서드는 반드시 try 블록 내에서 호출되어야함
public void method1() {
	try {
		method2();
	} catch(ClassNoyFoundException e) {
		//예외 처리 코드
		System.out.println("클래스가 존재하지 않습니다.");
	}
}

public void method2() throws ClassNotFoundException {  // 호출한 곳에서 예외 처
	Class clazz = Class.forName("java.lang.String2");
}
profile
나의 개발기록

0개의 댓글