관리 메뉴

나구리의 개발공부기록

자바의 정석 기초편 ch8 - 1 ~ 6[프로그램오류, 예외 클래스의 계층구조,예외처리하기, try-catch문의 흐름] 본문

유튜브 공부/JAVA의 정석 기초편(유튜브)

자바의 정석 기초편 ch8 - 1 ~ 6[프로그램오류, 예외 클래스의 계층구조,예외처리하기, try-catch문의 흐름]

소소한나구리 2023. 12. 4. 11:41

1) 프로그램오류

(1) 컴파일 타임 에러

  • 컴파일 할 때 발생하는 에러, IDE에서 코드 작성시 템플릿 줄에서 바로 에러 확인이 가능
  • 컴파일러가 하는 일은 구문체크, 번역, 최적화, 생략된 코드 추가 등의 기능을 함
  • 터미널(cmd)창에서 코드를 작성하면 일일히 컴파일 해줘야하지만 IDE는 자동으로 컴파일 함
  • 터미널에서 컴파일 방법
    • 1. 터미널 실행
    • 2. 컴파일 할 java파일이 있는 곳 (src폴더)으로 경로 이동, (cd 명령어 사용)
    • 3. 경로 이동 후 커맨드 입력 : javac 파일명.java

(2) 런타임 에러

  • 실행할 때 발생하는 에러 (실행 해야만 에러가 확인 가능) -> 런타임 에러가 발생하면 프로그램이 종료 됨
  • 터미널에서 실행 방법(프로그램 실행)
    • 1. 터미널 실행
    • 2. 실행할 class파일이 있는 곳 (bin폴더)으로 경로 이동
    • 2. 경로 이동 후 커맨드 입력 : java 파일명

(3) 논리적 에러

  • 작성 의도와 다르게 동작
  • 프로그램이 동작은 되지만 잘못되게 동작

2) Java에서 정의한 런타임 에러 (실행 중 발생할 수 있는 에러)

(1) 에러(Error)

  • 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
  • ex)OOME (Out of Memory Error)와 같은 문제는 프로그래밍 상으로 조치를 할 수 있는 부분이 없음

(2) 예외(exception)

  • 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
  • 코드를 통해 프로그램이 동작하도록 예외를 처리를 하여 오류를 정상화 할 수 있음

3) 예외 처리

  • 정의 : 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성 하는 것
  • 목적 : 프로그램의 비정상 종료를 막고 정상적으로 동작하게 하는 것 

(1) 예외클래스의 계층 구조

  • Throwable 클래스 - 모든 오류의 조상
  • Exception 클래스들 - 사용자의 실수와 같은 외부 요인에 의해 발생하는 예외
    • IOException - 입출력 예외(I/O)
    • ClassNotFoundException - 클래스가 존재하지 않음
    • RuntimeException 클래스들 - 프로그래머의 실수로 발생하는 예외
      • ArithmeticException - 산술계산예외(0으로 나눌 때 발생)
      • ClassCastException - 형변환 예외
      • NullPointerException - 널포인터 예외(참조변수가 null일때 메서드호출 등)
      • IndexOutOfBoundsException - 배열 범위 벗어남 예외

 


4) try-catch문

  • 예외를 처리할 때 사용, 즉 예외를 정상 흐름으로 반환하기 위함
  • 간단하게 작성하더라도 { } 을 생략할 수 없으며 여러 catch문을 적용할 수 있음

** 적용시 주의사항

  • 여러 catch문을 적용할 때 예외의 최고조상인 Exception을 제일 먼저 catch문으로 작성하면 아래의 catch문들이 동작하지 않으므로 Exception으로 예외를 처리하고자 할때는 try - catch문의 제일 아래에 적용해야함
  • Exception으로 예외처리를 한 catch블럭은 Exception과 그 자손의 예외까지 모두 처리해버리기 때문에 가능하면 넓은 범위로 예외를 처리하는 것보다, 정확히 발생되는 예외를 처리하는 것이 좋음
  • 그러나 Exception으로 모든 예외를 처리하는 것은 실제로 예외가 발생해야하는 상황도 정상흐름이 반환될 수 있기 때문에 권장하지 않음

(1) 동작 설명

  • try문에 예외가 발생할 것 같거나 예외를 처리해야하는 코드를 입력하고 catch문에서 처리해야할 예외를 지정하여 예외를 처리
  • 예외가 발생하면 try문에 작성된 다음 코드들은 실행되지 않고 바로 발생한 예외를 처리할 catch블럭을 찾아 넘어감
  • 처리해야 할 예외가 일치하는 catch블럭이 없으면 예외 처리를 하지 않음, 즉 예외를 처리하지 못하므로 프로그램이 종료가 됨
try {
	// 예외가 발생할 가능성이 있는 문장들을 작성
} catch (Exception1 e1) {
	// Exception1이 발생햇을 경우, 이를 처리하기 위한 문장을 작성
} catch (Exception2 e2) {
	// Exception2이 발생햇을 경우, 이를 처리하기 위한 문장을 작성
} catch (ExceptionN eN) {
	// ExceptionN이 발생햇을 경우, 이를 처리하기 위한 문장을 작성
}

 

(2) 예제1

  • 0/0 연산을 하여 고의로 ArithmeticException을 발생시키면, 그아래의 코드인 4를 출력하지 않고 바로 해당 예외를 처리할 수 있는 catch문으로 이동함
  • catch문의 제일 하단에 최고조상인 Exception으로 예외를 처리하여 그외의 예외가 발생할 경우 해당 catch문에서 예외를 처리
class ex8_4 {
	public static void main(String args[]) {
		System.out.println(1);			
		System.out.println(2);
        
		try {
			System.out.println(3);
            
			// 0으로 나눠서 고의로 ArithmeticException을 발생
			System.out.println(0/0);	// 고의적으로 예외 발생
			System.out.println(4); 		// 예외발생 되면 실행되지 않는다.
            
		} catch (ArithmeticException ae)	{
			if (ae instanceof ArithmeticException)	// 예외가 맞는지 확인
				System.out.println("true");	
			System.out.println("ArithmeticException");
            
		// ArithmeticException을 제외한 모든 예외를 처리
		} catch (Exception e){
			System.out.println("Exception");
            
		} // try-catch의 끝
        
		System.out.println(6);
	} // main메서드의 끝
}

 

(2) 예제2

  • 발생한 예외는 ArrayIndexOutOfBoundsException(배열범위 벗어남) 이지만 예외처리하는 catch문은 ArithmeticException예외만 적용되어있어 해당 프로그램은 예외를 처리하지못하고 프로그램이 비정상종료가됨
  • 꼭 예외처리는 예외가 발생하는 예외로 처리하거나 그 조상으로 처리해야함
class ex8_4 {
	public static void main(String args[]) {
		System.out.println(1);			
		System.out.println(2);
        
		try {
			System.out.println(3);
            
			// ArrayIndexOutOfBoundsException 에러 발생
			System.out.println(args[0]);
			System.out.println(4); 	// 예외발생 되면 실행되지 않는다.
            
		} catch (ArithmeticException ae)	{
			if (ae instanceof ArithmeticException) 
				System.out.println("true");	
			System.out.println("ArithmeticException");
            
		// 비정상 종료 하지 않도록 일치하는 예외로 처리하거나 Exception으로 예외 작성

		} catch (ArrayIndexOutOfBoundsException e)	{
        
        	System.out.println("ArrayIndexOutOfBoundsException");
        }
        
		System.out.println(6);
	}	// main메서드의 끝
}

// 실행 시 1,2,3 출력 후 6이 실행 되지 않고 에러 발생(비정상 종료)
// 예외가 발생한 것과 일치하도록 예외를 작성해야하며 최고조상인 exception으로 예외를 작성 해도 되지만 권장하지 않음

 

 

 

** 출처 : 남궁성의 정석코딩_자바의정석_기초편 유튜브 강의