gi_dor

[Java] CH8 예외처리 본문

First/Java

[Java] CH8 예외처리

기돌 2023. 4. 2. 16:18

프로그램오류 

1 ) 프로그램 실행중 비정상적으로 종료 , 오작동 하는 경우를 프로그램 에서 에러 또는 오류 라고한다

2 )   1️⃣ 컴파일 에러 :  :소스코드가 컴파일 되는 과정 중에 발생하는 에러  ✔ 생략코드 , 오타 대문자,소문자
       2️⃣ 런타임 에러 : 실행시 발생되는 모든 에러
       3️⃣ 논리적에러  : 실행은 되지만 작성한것과는 다른 결과로 작동함 

  • 컴파일 에러

  • 런타임 에러 
    ① Error : 심각   Out Of Memory
    ② Exception : 덜 심각  
       ◽ Exception의 자손   checked ←  필수 처리  -   사용자의 실수
       ◽ RuntimeException 의 자손  unchecked ←  선택 처리  -  프로그래머의 실수   
                                                                              Null Point Exception , Array Index Out Of Bounds Exception  
      
  • 논리적 에러 : 의도한 대로 동작하지 않음 - 프로그램이 작동하는데 비정상적인 결과를 보여줌

◾ Exception
   ◽ IOException   - 입력 출력 Input , Output
   ◽ ClassNotFoundException - class 파일이 존재 하지않음

   ◽ RuntimeException - 선택 처리
   ◽ ArithmeticException - 산술계산
   ◽ ClassCastException - 형변환
   ◽ NullPointerException - 널포인터
   ◽ IndexOutOfBoundsException - 배열 범위를 벗어남

3 )   Java에서 런타임 에러 

 

 

1️⃣ 에러 : 심각한 오류
2️⃣ 예외 : 덜심각한 오류 

Exception 클래스 와 그 자손들  ▶ 사용자 실수

  1. IOException : 입력 출력 에러 Input  Output 
  2. ClassNotFoundException :  클래스 파일 존재 유무 에러 //  (*.class)

RutimeException 클래스와 자손들 ▶ 프로그래머 실수

  1. ArithmeticException : 산술계산 에러 Ex. 5/0 17/0  ... 0 으로 나누기
  2.  ClassCastException  : 형변환
  3. IndexOutOfBoundsException : 배열의 범위를 벗어남

 

 예외 처리

▶ 프로그램 실행시 발생할수 있는 예외에 대비한 코드
🔑 프로그램의 비정상 종료 막고 , 정상적인 실행상태 유지

  • try - catch (직접 처리)
  • 예외 선언 ( 보고 )
  • 호출한 메서드와 호출된 메서드 양쪽에서 예외 처리
  • 은폐 

 

printStackTrace() 와 getMessage ()

◾ printStackTrace() 예외 발생 당시 호출스택에 있던 메서드 정보와 예외 메시지 출력

◾ getMessage() 발생한 예외 클래스의 인스턴스에 저장된 메시지 출력


try - catch  예외처리

▶ 예외 처리 : 예외 발생에 대한 코드를 작성 
▶ 그래서 왜 쓰는데 ?? 비정상적 종료를 막고 정상적인 실행 상태를 유지

try {
		// 예외 발생가능성 있는 문장
} catch ( Exception1 e) {
		// Exception1  발생할 경우 처리할 문장
    } catch (Exception2 e) {
    	// Exception2  발생할경우 처리할 문장
    }

1️⃣ try 블랙내에 예외가 발생 
1 ) 발생한 예외와 일치하는 catch 블럭 확인 
2 ) catch 블럭 문장 수행후 전체 try - catch 문 빠져 나간뒤 다음문장 수행
3 ) 일치하는 catch 블럭 못찾을 경우 예외 처리 못함

+ ) catch블럭이 여러개일경우 해당하는 catch 블럭만 수행후 빠져나옴


2️⃣ try 블럭내에 예외가 발생하지 않은경우
catch 블럭을 건너뛰어서 전체 try - catch 문을 빠져 나가서 수행을 계속 함

System.out.println(1);
		try {
			System.out.println(2);
			System.out.println(3);
		}catch (Exception e) {
			System.out.println(4);
		}
		System.out.println(5);

System.out.println();
		System.out.println("기본판 예제 8 - 2");
		System.out.println(11);
		try {
        	System.out.println(13/0);  // 예외 발생  try 문 빠져나와서 catch 찾기
			System.out.println(12);
			
		}catch (ArithmeticException ea) {  // catch 문 찾음 
							   // 블럭내 문장 수행후 빠져 나가서 계쏙 수행
			System.out.println(14);
		}
		System.out.println(15);

 

 


예외 선언하기

◾ 메서드가 호출시 발생가능한 예외를 호출한 쪽에 알리기
◾ 예외 선언은 checked 만 적는것이 정석 

throw : 예외 발생 키워드
throws : 예외 선언 키워드

예외 되던지기

◾ 예외 처리 한 후에 다시 예외 발생시킴
◾ 호출한 메서드와 호출된 메서드 양쪽에서 예외 처리


예외 발생시키기

◾ 발생시키려는 예외 클래스의 객체를 만든다
   Exception e = new Exception(" 고의로 발생 시킴 ")

◾ 키워드 throw를 이용해서 예외 발샐시킨다
  throw e;

try {
 	Exception e = new Exception (" 123 ");
    throw e ;
    // throw new Exception ("123");
    
    } catch ( Exception e ){
    System.out.println("에러 메세지 : "+ e.getMessage() );
    e.printStackTrace();
    }
    System.out.println("종료 되었습니다");
    }

 


finally 블럭

◾ 예외의 발생여부에 상관없이 실행되야 하는 코드 
◾ try 나 catch 블럭의 문장 수행중에 return 문을 만나도 finally 문장들은 수행된다.


연결된 예외

◾ 예외 A가 예외 B를 발생시키면 A는 B의 원인 예외
◾ A 와 B를 연결하는 것을 연결된 예외 라고 한다.


멀티 catch블럭

✔ 내용이 같은 catch 블럭을 하나로 합침

try { 
 	System.out.println(1);
 } catch ( Exception1 e) {
  e. printStackTrace();		// 내용 같음
 } catch ( Exception2 e2) {
  e2. printStackTrace ( ) ;	// 내용 같음
  } 						// 중복을 제거 하기 위해 멀티 catch 사용
  
  try {
  	System.out.println(1);
    } catch ( Exception1 | Exception2 e ) {
     e.printStackTrace ( );
     }
  •  부모 자식 관계의 예외 클래스는 에러  ▶ 그냥 조상 클래스 사용
  •  | 기호 
  • 예외를 멀티 catch블럭으로 처리할 때 , 멀티 catch 블럭내에 실제로 어떤 예외가 발생한것인지 알수 없음

 

 

728x90