Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

Everything has an expiration date

★ 147 - Java 예외처리(Exception Handling) : throws Exception, try~catch(Exception e) 문을 통한 예외처리. toString(), getMessage(), printStackTrace() 본문

[Java]/Java Concepts

★ 147 - Java 예외처리(Exception Handling) : throws Exception, try~catch(Exception e) 문을 통한 예외처리. toString(), getMessage(), printStackTrace()

Jelly-fish 2023. 9. 20. 15:53

 

[예외 처리 (Exception Handling)]

○ 프로그램에서 발생하는 오류(Error)는

   ① 잘못된 문법을 사용하거나 변수 등을 정의하지 않은 상태에서
       사용함으로써 컴파일 단계에서 발생하는 문법적인 오류(Error)

   ② 프로그램을 실행하는 과정에서 발생되는 런타임 오류(Error)
        나눌 수 있다.

- 개발자가 문제 분석을 잘못하거나 실수에 의해
  엉뚱한 결과를 가져오게 되는 논리적인 오류(Error)

- 시스템 이상에서 발생되는 시스템 오류(Error), 그리고

- 프로그램 실행 중 발생되는 비정상적인 상황을 의미하는
  예외 사항(Exception)이 있다.


    예를 들어,
→ 어떤 수를 0으로 나누거나...
→ 배열을 제어하는 과정에서 첨자를 벗어나는 상황이 발생하거나...
→ 존재하지 않는 파일을 오픈하여 읽어들인다거나...

==> 개발자가 이런 예외 사항이 발생할 경우를 미리 예측하여
    적절히 대응하기 위한 절차를 구현하도록 문법을 정리해 놓은 것.
    ☆ 예. 외. 처. 리. ☆


※ 정리해 놓은 문법~!!! (→ Exception 클래스)

-   예외는 프로그램 실행 중에 발생할 수 있는
    명령어의 정상적인 흐름을 방해하는 이벤트로
   ★ 자바에서 예외는 하나의 오브젝트(Object, 객체)이다.



- 프로그램 실행 중에 메소드 안에서 오류(Error)가 발생하게 될 경우,
  메소드는 그 오류에 해당하는 예외 오브젝트를 만들고
  그것을 자바 런타임 시스템(Runtime System)에 전달해 준다.
  (자바 가상머신 내에 있는 시스템. → 런타임 시스템)
 
자바에서의 모든 예외 클래스는 Throwable 클래스
  Throwable 클래스의 하위 클래스를 상속받아 사용한다.

Throwable 클래스는  ★ 예외를 설명하는 문장이나
  ★ 예외가 발생할 때의 프로그램 상태에 관한 정보 를 포함하고 있다.

 - Throwable 클래스에서 파생된 클래스 (던질 수 있는 클래스...)




 · Exception 클래스
    Exception 예외 클래스는 일반적으로 프로그래머에 의해
    복원될 수 있는 예외 사항으로
    메소드가 실행 중에 던지는 예외를 가리킨다.

 · Error 클래스
    심각한 예외의 형태 개발자가 복원할 수 없는 형태의 예외이다.



[ 예외의 종류 ]

  - [ checked exception ]
  
메소드 내에서 예외가 발생한 경우
메소드를 정의할 때 『throws』 문에 메소드 내에서 발생할 수 있는
예외들을 명시해 주거나 또는 그 예외를 『try~catch』해서
처리해 주어야만 하는 예외이다.

컴파일러가 컴파일 하는 과정에서 『checked exception』이
『throws』 되는가의 여부 혹은 『try~catch』되는지의 여부를 판단하여

★ 프로그램에서 예외를 어떤 방식으로든 처리하지 않으면 컴파일 자체가 불가능 ★ 하다.


  - [ unchecked exception ]
   
    ★ 사전에 처리하지 않아도 컴파일러가 체크하지 않는 ★
    런타임 시에 발생할 수 있는 예외이다.




[ java.lang.Throwable 클래스의 주요 메소드 ]
   

   - String toString()   (부모 클래스 Object의 toString() 메소드를 오버라이딩 한 형태이다.)
     : Throwable 각각에 대한 설명을 문자열 형태로 반환한다.
   
   - void printStackTrace(PrintStream s)
   - void printStackTrace(PrintWriter w)
     : 표준 출력 스트림에 스택 호출 목록을 마지막 메소드부터 출력한다.



[ 주요 런타임 예외 클래스 ]

   - ArithmeticException
     : 수치 계산상의 오류(0으로 나누기 등)
   
   - ArrayStoreException
     : 배열에 잘못된 데이터 형을 저장하려 했을 경우 발생하는 오류

   - IndexOutOfBoundsException
     : 배열, 문자열, 벡터 등에서 인덱스(첨자) 범위가 벗어난 경우 발생하는 오류
   
   - ClassCastException
     : 클래스 변환을 잘못한 경우 발생하는 오류
   
   - NullPointerException
     : 빈 객체를 참조하는 경우(초기화 되지 않은 변수 사용 등)
       발생하는 오류
   
   - SecurityException
     : 자바의 내부 보안 사항을 위반하였을 경우 발생하는 오류

 

예외 처리(Exception Handling) 실습 코드 - Test147.java
/* ============================================
■■■ 예외 처리(Exception Handling) ■■■
=============================================*/

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

// IOException → checked Exception

public class Test147
{                                          // ①
					// ① 폭탄이 들어오면 바로 밖으로 던져버림(확인x)
	public static void main(String[] args) //throws IOException
	{
		// BufferedReader 클래스 인스턴스 생성
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		// 주요 변수 선언
		int a, b, c;

		/*
		// ②
		try
		{
			System.out.print("첫 번째 정수 입력 : ");
			a = Integer.parseInt(br.readLine());
			System.out.print("두 번째 정수 입력 : ");
			b = Integer.parseInt(br.readLine());

			c = a + b;

			System.out.println("결과 : " + c);
			
		}
		// ② 폭탄을 잡아내고,
		//    폭탄을 어떻게 처리할 것인가에 대한 추가적인 행동을 명시.

		catch (IOException e)	// 만약... 괄호 안의 상황을 e로 이름 붙이고, 이것이 발생되면
		{
			// IOExcepiton → checked exception
			//-- 메소드를 정의하는 과정에서 throws 한 예외
			//   잡아내거나 던지지 않을 경우 컴파일 에러 발생.
		
			System.out.println(e.toString());	// 출력한다.
		}

		
		
		// ③
		try
		{
			System.out.print("첫 번째 정수 입력 : ");
			a = Integer.parseInt(br.readLine());
			System.out.print("두 번째 정수 입력 : ");
			b = Integer.parseInt(br.readLine());

			c = a + b;

			System.out.println("결과 : " + c);
			
		}

		catch (IOException e)			
		{
			// IOExcepiton → checked exception
			//-- 메소드를 정의하는 과정에서 throws 한 예외
			//   잡아내거나 던지지 않을 경우 컴파일 에러 발생.
		
			System.out.println(e.toString());		
		}
		//checked exception만 잡아내면 자바는 컴파일 
		catch (NumberFormatException e)
		{
			// NumberFormatException → unchecked exception
			//-- 런타임 시 발생할 수 있는 예외로
			//   반드시 던질 필요도, 잡아낼 필요도 없다.
			//   → 별도 처리가 없더라도... 컴파일 과정에서 문제삼지 않음
			System.out.println(e.toString());
			System.out.println(">> 숫자 형태의 데이터를 입력해야 합니다~!!!");
		}
		
		
		// ④
		try
		{
			System.out.print("첫 번째 정수 입력 : ");
			a = Integer.parseInt(br.readLine());
			System.out.print("두 번째 정수 입력 : ");
			b = Integer.parseInt(br.readLine());

			c = a + b;

			System.out.println("결과 : " + c);
			
		}
		catch (Exception e)	// Exception 을 직접 명시하지 않고, 예외를 e에 담기만 한다.
					// 모두 다 Exception 하나로 처리한다. (부모 클래스이므로...)
		{
			System.out.println("e.toString() : " + e.toString());
			System.out.println("e.getMessage() : " + e.getMessage());
			System.out.println("printStackTrace..................");
			e.printStackTrace();
			
		}

		*/

		try
		{
			System.out.print("첫 번째 정수 입력 : ");
			a = Integer.parseInt(br.readLine());
			System.out.print("두 번째 정수 입력 : ");
			b = Integer.parseInt(br.readLine());

			c = a + b;

			System.out.println("결과 : " + c);
			
		}
		// e.getMessage() → 예외가 발생한 원인을 메시지로 알려 준다.
		// 이 소스의 경우에서는 a와 b를 입력받은 문자열을 정수 int형으로 변환하는 과정에서
		// 숫자형태의 문자열이 아닌 것을 입력할 때 예외가 발생하므로 이를 출력한다.

		catch (Exception e)	// Exception 을 직접 명시하지 않고, 예외를 e에 담기만 한다.
						// 모두 다 Exception 하나로 처리한다. (부모 클래스이므로...)
		{
			System.out.println("e.toString() : " + e.toString());
			System.out.println("e.getMessage() : " + e.getMessage());
			System.out.println("printStackTrace..................");
			e.printStackTrace();
			
		}
		finally
		{
			// 예외가 발생하거나 발생하지 않거나 언제나 실행되는 영역
			System.out.println("고생 많으셨습니다~ 감사합니다.");
		}
		

	}
}