Java Exception

Error와 Exception

  • Error와 Exception은 모두 Throwable 클래스의 하위 클래스인데, Error는 보통 시스템 리소스 문제로 발생하게 되는데 보통 시스템 충돌, 메모리 부족이 있고 Exception은 컴파일 시간과 런타임시 발생하는게 대부분

Error

  • 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램에 이상이 생겼거나 JVM 실행에 문제가 생겼을 경우 발생
  • 컴파일단계에 발생할 수 없다.
  • 프로세스에 영향을 준다.
  • 시스템 레벨에서 발생(자바 프로그램 외의 오류)
  • VirtualMachineError, OutOfMemoryError, StackOverflowError

Exception

  • 컴퓨터의 에러가 아닌 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류
  • 런타임, 컴파일단계에 발생
  • 스레드에 영향을 준다.
  • 예외가 발생하면 프로그램이 종료가 된다는 것은 에러와 동일하지만 예외는 예외처리(Exception Handling)을 통해 프로그램을 종료시키지 않고 정상적으로 작동되게 만들어줄 수 있다.
  • 자바에서 예외처리는 try-catch문을 통해 사용한다.

RuntimeException

  • 예외처리를 통해 처리할 수 있는 예외
  • 모든 예외 클래스는 java.lang.Exception에 저장되어 있다.
  • 일반예외(Exception) : 일반예외와 실행예외 클래스를 구별하는 방법은 일반예외는 Exception을 상속받지만, RuntimeException은 상속받지 않음
  • 실행예외(RuntimeException) : 실행예외는 java.lang.Exception 하위 클래스 java.lang.RuntimeException을 상속, JVM에서는 RuntimeException 상속 여부를 보고 판단

CheckedException과 UncheckedException

CheckedException

  • 체크가 가능한 예외
  • 체크란 compiler 단에서 체크 가능한 에러, RuntimeException과 상반된다고 할 수 있다.
  • 체크된 에러들, 즉 에러가 발생할 수 있을 때에는 예외처리를 진행해줘야 하는데 자바에서 강제적으로 try-catch문을 작성하도록 하게된다.
	try {
		Class clazz = Class.forName("java.lang.Strang2");
	} catch (ClassNotFoundException e) {
		// TODO: handle exception
		e.printStackTrace();
	}
  • Class.forName(String str)에서 str 매개변수의 클래스가 존재하면 Class 객체를 리턴하지만 존재하지 않으면 ClassNotFoundException 예외를 발생시키게 된다.
  • ClassNotFoundException 예외는 일반 예외이므로 컴파일러는 개발자가 예외처리를 작성하도록 만들게된다.

UncheckedException

  • 컴파일러 자체에서 찾아내지 못하는 예외
  • CheckedException과 다르게 예외처리를 강제로 하지않는다.
	int arr[] = {1, 2, 3, 4, 5};
	System.out.println(arr[6]);
	// java.lang.ArrayIndexOutOfBoundsException 발생
  • try-catch를 사용해야할지 컴파일러가 명시해주지 않기 때문에, 개발자의 경험 또는 테스트를 통해 예외처리를 해줄 수 있도록 해야한다.

예외처리방법

	try {

	  // 예외발생코드
	} catch (e1) {
	  // e1 예외 발생 시 처리코드
	} catch (e2) {
	  // e2 예외 발생 시 처리코드
	} finally {
	  // 항상 실행되는 코드
	}

Java 7, Multi catch

  • Java 7 이상부터 여러개의 catch문들을 효과적으로 다룰 수 있도록 제공
  • 복잡한 여러개의 catch scope를 한번에 한개의 스코프로 합쳐주게 된다.
	try {
	// 예외발생코드
	} catch (예외1 | 예외2 e) {
	  // e1 예외 발생 시 처리코드
	} finally {
	  // 항상 실행되는 코드
	}
	try {
		Class clazz = Class.forName("java.lang.Strang2");
	} catch (ClassNotFoundException | NullPointerException e) {
		e.printStackTrace();
	} finally {

	}

Java 7, try-catch-resource

  • Java 7 이상부터 InputStream, 또는 네트워크프로그래밍에서 사용하는 Socket, ServerSocket을 좀 더 안전하게 사용할 수 있도록 제공
  • return 하기전 close() 메서드를 실행해줘야하는 불편함 해소
	FileInputStream fis = null;
	try {
		fis = new FileInputStream("MyFile.txt");
	} catch (IOException e) {
		e.printStackTrace();
	} finally {
		if (fis != null) {
			try {
				fis.close();
			} catch (IOException e) {
				e.printStackTrace();
				// 또 다른 try-catch 문을 작성해줘야함
			}
		}
	}
	try (FileInputStream fis = new FileInputStream("MyFile.txt")) {
		// try() Exception 발생 시 fis.close() 메소드 실행
		// 명시적으로 fis.close() 를 적어주지 않는다.
		System.out.println(fis.read());
	} catch (IOException e) {
		e.printStackTrace();
	}

예외 던지기 throws

  • 기본적으로 예외처리는 try-catch문으로 하는게 보통이지만 자신을 호출한 메서드에 Exception문을 넘겨 처리할 수 있다.
	public static void method1() {
		try {
			method2();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			System.out.println("Finish");
		}
	}
	
	private static void method2() throws ClassNotFoundException {
		Class clazz = Class.forName("java.lang.String2");		
	}
	
	public static void main(String[] args) {
		method1();
	}
  • method1에서 method2를 처리하는 도중 예외가 발생하면, method1에 예외를 던질 수 있다. 이를 예외 떠넘기기라고 한다.

사용자 정의 예외

	public class CustomException extends Exception{
		public CustomException() {
		}
		public CustomException(String message) {
			super(message);
		}
	}
	public void method() throws CustomException {
		throw new CustomException("예외처리");
	}

Categories:

Updated:

Comments