자바의 정석 8장 (20일차) - 프로그램 오류

728x90

오류 종류

컴파일 에러: 컴파일 시 생기는 오류 (system.out.print => s의 소문자 같은 컴파일 원인 오류)

논리적 에러: 실행은 되지만 의도와 다르게 동작되는 오류

런타임 에러: 시스템을 실행할 때 생기는 오류 (int[] => 빈 공백을 사용할 시 오류등이 런타임 에러)

  • 런타임에러의 종류
    • 에러(error): 수습 불가능한 심각한 오류; out of memory error; OOME
    • 예외(exception): 코드에 의해 수습될 수 있는 다소 미약한 오류
  • 예외처리
    • 정의: 오류를 대비한 코드를 작성
    • 목적: 비정상적인 프로그램 종료를 막고 오류 대비 코드로 재실행

예외처리 시 try - catch 문 사용

		try {	
			//예외가 발생할 수도 있는 코드
		} 
		catch (Exception e) {
        	//예외 발생시 실행할 코드 순서대로
		} 	
		catch (Exception2 e) {
		}
		catch (Exception3 e) {
		}

 

예외처리 시 exception은 모든 exception 클래스의 조상, 따라서 모든 에러 포함

Arithmetic 같이 특별한 에러를 지정하면 그 에러에 맞게 출력되는 코드 다양화 가능

public class TryCatch {
	public static void main(String[] args) {
		int[] i = {1,2,3};
		try {
			System.out.println(1);	
			System.out.println(2);
			System.out.println(i[3]); // Exception의 all error
			System.out.println(0/0); //Arithmetic error
		} 
		catch (ArithmeticException e) {
			System.out.println(3 + " Arithmetic errors");
		}
		catch (Exception e) {
			System.out.println(3 + " all errors");
		}
	}
}

 


printStackTrace() & getMessage() 함수

printStackTrace(): 예외발생 당시의 호출스택(call stack)에 있던 메서드 정보와 예외 메시지를 화면에 출력

getMesasge(): 발생한 예외 클래스의 인스턴스에 저장된 메세지를 얻을 수 있음

 

예외가 발생되면 예외 객체가 생성되고 그 스택에서 얻은 예외 메세지를 출력한다 - printStackTrace()

발생된 에러 메세지에서 원인을 도출할 수 있는데 그 함수가 - getMessage()

출력문:

1
2
3 Arithmetic errors
예외 메세지: / by zero
java.lang.ArithmeticException: / by zero at Lecture.TryCatch.main(TryCatch.java:9)
4

package Lecture;

public class TryCatch {
	public static void main(String[] args) {
		int[] i = {1,2,3};
		try {
			System.out.println(1);	
			System.out.println(2);
			System.out.println(0/0); //Arithmetic error
			System.out.println(i[3]); // Exception의 all error
		} 
		catch (ArithmeticException e) {
			if(e instanceof ArithmeticException){
				//instanceof로 ArithmeticException이 e로 형변환 가능한지 확인
				System.out.println(3 + " Arithmetic errors");
				System.out.println("예외 메세지: "+e.getMessage());
				e.printStackTrace();
			}
		}
		catch (Exception e) {
			System.out.println(3 + " all errors");
		}
		System.out.println(4);	
	}
}

 

멀티 catch 블럭

exception의 내용이 같을 때 아래와 같이 catch 구문을 묶어줄 수 있음

  • 연산자 | 사용
  • 다만 부모 자식관계의 exception은 멀티 catch 블럭 불가
    • 부모 exception만 선언해주면 자식 exception은 자동으로 예외처리 가능하기 때문에 컴파일 에러
//		exception의 내용이 같을 때 catch 구문을 묶어줄 수 있음
		catch (ArrayIndexOutOfBoundsException | ClassCastException e) {
			e.printStackTrace();
		}
728x90