관리 메뉴

너와 나의 스토리

[Java Exception] 예외와 예외 클래스 / 예외 처리 본문

Programming Language/Java

[Java Exception] 예외와 예외 클래스 / 예외 처리

노는게제일좋아! 2021. 4. 21. 13:36
반응형

에러(Error)

  • 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 애플리케이션 실행 오류가 발생하는 것
  • 에러는 JVM 실행에 문제가 생겼다는 것으로, 개발자는 이런 에러에 대처할 방법이 없다.
  • 자바에서는 에러 이외에 예외(exception)이라고 부르는 오류가 있다.
    • 예외란 개발자의 잘못된 코딩 또는 사용자의 잘못된 조작으로 발생하는 오류를 말한다. 
  • 에러는 발생하면 곧바로 프로그램이 종료된다. 하지만 예외는 예외 처리(Exception Handling)을 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있다.

 

 

예외(Exception)

  • 예외에는 두 가지 종류가 있다.
    • 일반 예외(Exception)
      • 컴파일 체크 예외라고도 한다.
      • 자바 소스를 컴파일하는 과정에서 예외 처리 코드가 필요하는지 검사함.
    • 실행 예외(Runtime Exception)
  • 자바에서는 예외를 클래스로 관리한다.
    • JVM은 프로그램을 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성해 이용하도록 한다.
    • 모든 예외 클래스는 Exception 클래스를 상속 받는다.

사진 출처: https://dololak.tistory.com/53

  • 일반 예외: Exception을 상속받지만 RuntimeException을 상속받지 않는다.
  • 실행 예외: RuntimeException을 상속받는다.

 

 

Runtime Exception

  • Runtime Exception은 자바 컴파일러가 체크하지 않기 때문에, 개발자가 직접 예외 처리 코드를 작성해야 한다.
  • NullPointerException
    • 객체 참조가 없는 상태
    • null 값을 갖는 참조 변수로 객체 접근 연산자인 '.'를 사용했을 때 발생한다.
String data = null;
System.out.println(data.toString()); // NullPointerException 발생
  • ArrayIndexOutOfBoundsException
    • 배열에서 인덱스 범위를 초과하여 사용할 경우 발생한다.
  • NumberFormatException
    • 문자열로 되어 있는 데이터를 숫자로 변경하는 경우가 있다. 
      • 예: Integer.parseInt(String s), Double.parseDouble(String s)
    • 이때, 숫자로 변환될 수 없는 문자가 포함되어 있다면 NumberFormatException 에러가 발생한다.
  • ClassCastException
    • 타입 변환(Casting)은 [상위 클래스-하위 클래스], [인터페이스-구현 클래스]관계에서 가능하다.
    • 이러한 관계가 아닌데 타입 변환을 시도하는 경우 ClassCastException이 발생한다.
      • instanceof를 이용해 true인 경우만 캐스팅하자!
* case1: casting 가능
Animal animal = new Dog();
Dog dog = (Dog) animal;


* case2: casting 불가
Animal animal = new Dog();
animal instanceof cat // false 
Cat cat = (Cat) animal; // ClassCastException 발생

 

 

 

예외 처리

  • try-catch-finall 블록을 이용해서 예외처리를 해준다.
try {
	// 예외 발생 가능한 코드 
} catch (예외 클래스 e) {
	// 예외 처리
} catch (예외 클래스 e) {
	// 예외 처리
} finally {
	// 항상 실행되는 코드
}
  • try 블록에서 예외 발생 없이 코드가 정상 실행되면 catch 블록은 실행되지 않고 finally 블록으로 넘어가게 된다.
  • finally 블록은 옵션으로 생략 가능하다.
  • catch문은 1개 이상 작성할 수 있다.
    • try 블록 내부에서 다양한 종류의 예외가 발생할 수 있는데, 이 경우, 발생되는 예외 별로 catch 문을 작성할 수 있다.
    • 다중 catch 블록을 작성할 경우, 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 한다.
      • catch 블록은 위에서부터 차례대로 검색되기 때문
    • try 블록에서 다양한 종류의 예외가 발생할 수 있지만, 따로따로 처리해주고 싶지 않은 경우, 하나의 catch문에서 한 번에 처리해줄 수 있다.
try {
	// 예외 발생 가능한 코드 
} catch (예외 클래스1 e1 | 예외 클래스2 e2) {
	// 예외 처리
}

 

 

자동 리소스 닫기

  • try-with-resources를 사용하면 예외 발생 여부와 상관없이 사용했던 리소스 객체를 close해준다.
    • 리소스 객체: 데이터를 읽고 쓰는 객체(각종 입출력 스트림, 서버 소켓, 소켓, 각종 채널)
  • try-with-resources 사용 조건: java.lang.AutoCloseable 인터페이스를 구현하고 있어야 한다.
    • AutoCloseable에는 close() 메서드가 정의되어 있다.
public class FileInputStream implements AutoCloseable {
	// ...
}
try {
	fis = new FileInputStream("file.txt");
} catch (IOException e) {

}
  • FileInputStream의 close()를 호출하는 코드를 작성하지 않았지만, 자동으로 close() 메서드를 호출한다.

 

 

Throw Exception

  • 메서드 내부에서 try-catch 블록으로 예외를 처리하는 것 대신, 경우에 따라서 메서드를 호출한 곳으로 예외를 떠넘길 수도 있다.
public void method1() {
  try {
      method2();
  } catch (ClassNofFoundException e) {
      // 예외 처리
  }
}

public void method2() throws ClassNotFoundException {
	Class c = Class.forName("java.lang.String2");
}
  • method2()에서 예외가 발생 (가능)하지만, 자신을 호출한 method1()에게 예외를 떠넘겨 method1()이 예외 처리하도록 한다.

 

 

사용자 정의 예외

  • 사용자 정의 예외 클래스 선언
public class CustomException extends RuntimeException // 또는 Exception
    public CustomException() {}
    public CustomException(String msg) {
    	super(msg);
    }
}
  • 예외 발생시키기
public void method1() throws CustomException {
	// ...
}

 

 

예외 정보 얻기

  • 모든 예외 객체는 Exception 클래스를 상속받기 때문에, Exception이 가지는 메서드를 모든 예외 객체에서 호출할 수 있다.
  • getMessage()
    • 예외를 발생시킬 때 메시지를 갖는 생성자를 이용했다면, 메시지는 자동적으로 예외 객체 내부에 저장된다.
      • 예: throw new CustomException("예외 메시지");
    • 예외.getMessage()를 하는 경우 예외가 가지고 있는 Message를 얻을 수 있다.
  • printStackTrace()
    • 예외 발생 코드를 추적해서 모두 콘솔에 출력한다.
    • 예외 발생 경로를 알 수 있다.

 

 

 

출처:

- [이것이 자바다]

반응형
Comments