예외 클래스

에러(error) : 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것

예외(exception) :

  • 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류
  • 예외가 발생하면 프로그램이 곧바로 종료된다는 점에서 에러와 비슷
  • 그러나 예외 처리를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지된다는 점에서 에러와 차이가 있다.

예외 클래스 : 자바에서는 예외를 클래스로 관린한다. 모든 예외 클래스는 java.lang.Exception 클래스를 상속받는다.

 

< 예외의 두가지 종류 >

일반 예외 (exception) : 컴파일러 체크 예외. 자바 소스를 컴파일하는 과정에서 해당 예외 처리 코드가 있는지 검사한다. 만약 예외 처리 코드가 없다면 컴파일 오류가 발생함

실행 예외 (runtime exception) : 컴파일러 넌체크 예외. 실행 시 예측할 수 없이 갑자기 발생. 따라서 컴파일하는 과정에서 예외 처리 코드가 있는지 검사하지 않는다.

 

실행 예외

  • 오로지 개발자의 경험에 의해서 예외처리 코드를 작성해야 한다.
  • 프로그램에서 예외가 발생하면 예외 메시지가 콘솔뷰에 출력된다.
  • 콘솔뷰에서는 어떤 예외가 어떤 소스의 몇 번째 코드에서 발생했는지 알 수 있다.

NullPointerException : 객체 참조가 없는 상태

 예를 들어, String s = null; 인데 s.toString() 메소드를 호출하는 경우

ArrayIndexOutOfBoundsException : 배열에서 인덱스 범위를 초과할 경우 발생.

예를 들어, int[ ] arr = new int [3] 배열에 arr[3] 의 값을 넣으려고 하는 경우

NumberFormatException : 숫자로 변환될 수 없는 문자를 숫자로 변환하려 할 때 발생

  • String to int : Integer.parseInt(String s)
  • String to double : Double.parseDouble(String s)

예를 들어, String s = "a100"; 이라는 문자열을 숫자로 변환하려고 하는 경우

 

ClassCastException : 상위 클래스와 하위 클래스간 타입 변환시 발생하는 오류. 타입 변환 전에 변환이 가능한지 instanceof 연산자로 확인하는 것 이 좋다. 

 

Animal animal = new Dog();
Dog dog = (Dog) animal;
  • 위와 같은 경우 Animal 타입 변수에 대입된 객체가 Dog이므로 다시 Dog로 변환하는 것은 아무런 문제가 없다.
  • 그러나 다시 Cat 클래스로 타입변환을 한 경우 대입된 객체가 아닌 다른 클래스 타입으로 변환되었기 때문에 예외가 발생한다.

 

예외 처리 코드

예외 처리 : 프로그램에서 예외가 발생했을 경우 프로그램의 갑작스러운 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는 것

 

try - catch - finally 블록 : 생성자 내부와 메소드 내부에서 작성되어 일반 예외와 실행 예외가 발생할 경우 예외 처리를 할 수 있도록 해준다.

 

https://tutorial.eyehunts.com/java/try-catch-finally-java-blocks-exception-handling-examples/

  • try 블록에 예외 발생 가능 코드가 위치한다.
  • try 블록의 코드가 정상 실행 된다면 바로 finally  블록의 코드를 실행하고, 만약 예외가 발생한다면 바로 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드를 실행한다. 그리고 finally 블록의 코드를 실행한다.
  • finally블록은 생략 가능하다. 예외 발생 여부와 관계없이 항상 실행할 내용이 있을 경우에만 작성해주면 된다.

 

다중 catch 블록 

  • try 블록 안에 다양한 예외가 발생할 수 있다.
  • try 블록에서 특정 타입의 예외가 발생하면 catch 블록에서도 그 타입에 맞는 예외 처리가 실행된다.
  • try 블록에서 예외가 발생했을 때, 예외를 처리해 줄 catch블록은 위에서부터 차례대로 검색된다.
  • 따라서, catch 블록이 여러 개라 할지라도 해당되는 단 하나의 catch 블록만 실행된다.
  • 주의할 점은, 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 한다는 것 (아래 사진 참조)

  • 위의 왼쪽 사진에서 ArrayIndexOutBoundsException은 Exception을 상속받기 때문에 첫 번째 catch 블록만 선택되어 실행이 된다. 따라서 두 번째 catch 블록은 어떤 경우라도 실행되지 않는 문제가 있다. 올바르게 사용한 예시는 오른쪽이라고 할 수 있다.

③ 예외 떠넘기기 - throws

  • 메소드 내부에서 예외 처리를 할 때 try - catch 블록으로 처리하는 것이 기본이지만,
  • 경우에 따라 메소드를 호출한 곳으로 예외를 떠넘길 수도 있다.
  • throws 키워드는 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 한다.
  • 그러면 메소드를 호출하는 곳에서 try-catch 블록을 사용해 예외 처리를 해줘야 한다.
  • main()메소드에선 throws Exception을 사용하는 것이 바람직하지 않기 때문에, try-catch 예외를 최종 처리해주는 것이 좋다.

예외 떠넘기기 참고 블로그 :

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=heartflow89&logNo=220985722731 

 

[JAVA/자바] 예외 던지기/떠넘기기 - throws

 이번 포스팅은 예외를 처리하는 두 번째 방법에 대해서 알아보려고 한다. 이전에 알아본 예외가 발생...

blog.naver.com

 

+ Recent posts