본문 바로가기
Language/java

Java_Study 예외처리

by gamxong 2022. 7. 11.

 

예외처리

 

RuntimeException 클래스들 (unchecked예외) 프로그래머의 실수로 발생하는 예외
Exception 클래스들 (checked예외) 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외

 

 

예외처리하기 - try - catch문

 

예외처리란?

 정의 - 프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것
 목적 - 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것

 

예시코드

class ExceptionEx1 {
	public static void main(String[] args)
    {
    	try {
        	try {  } catch (Exception e) { }
        } catch (Exception e) {
        	try {  } catch (Exception e) { } // 에러. 변수 e가 중복 선언
        }
        
        try {
        
        } catch (Exception e) {
        
        }
    }
}

 

class ExceptionEx3 {
	public static void main(String args[]) {
    	int number=100;
        int result=0;
        
        for(int i=0; i<10; i++){
        	try{
            	result = number / (int)(Math.random()*10);
                System.out.println(result);
            } catch (ArithmeticException e) {  // ArithmeticException이 발생하면 실행되는 코드
            	System.out.println("0");   
            }
         }
    }
}

 

 

* try 블럭 내에서 예외가 발생한 경우,
  1. 발생한 예외와 일치하는 catch블럭이 있는지 확인한다.
  2. 일치하는 catch블럭을 찾게 되면, 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계
      속해서 수행. 만일 일치하는 catch블럭을 못찾으면 예외는 처리되지 못함.

* try 블럭 내에서 예외가 발생하지 않은 경우,
  1. catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속함.

 

 

예외의 발생과 catch블럭

 

 - catch블럭의 괄호() 내에는 처리하고자 하는 예외와 같은 타입의 참조변수 하나를 선언해야 한다.

 - 예외가 발생하면, 발생한 예외에 해당하는 클래스의 인스턴스가 만들어 진다.

 

 - 예외를 찾을 때 예외 클래스의 인스턴스에 instanceof 연산자를 이용해서 검사함.

 

 

printStackTrace() 예외발생 당시의 호출스택에 있었던 메서드 정보와 예외 메시지를 화면에 출력
getMessage() 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있다.

 -> 발생원인 파악 가능

 

 

멀티 catch블럭

 

try{

} catch (ExceptionA e) {
	e.printStackTrace();
} catch (ExceptionB e) {
	e2.printStackTrace();
}

//same

try{

} catch (ExceptionA | ExceptionB e) {
	e.printStackTrace();
}

 * 여기서 사용된 "|"는 논리연산자가 아닌 기호이다.

 

 

 

예외 발생시키기

 

1. 먼저, new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음
    Exception e = new Exception([String]);
2. 키워드 throw를 이용해서 예외를 발생시킨다.
    throw e;

 

 

메서드에 예외 선언하기

 

void method() throws Exception1, Exception2, ... ExceptionN {
	//method 내용
}

 

예외를 넘겨준다는 것은 예외가 처리된 것이 아니라, 예외를 단순히 전달만 하는 것.

 

 

finally 블럭

 

: try-catch문과 함께 예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용됨.

  try -> catch -> finally 의 순서로 구성

 

* return문을 만나도 finally 블럭은 실행됨.

 

 

자동 자원 반환 _ try-with-resources문

 

??? 이해 제대로 x

 

 

사용자정의 예외 만들기

 

class MyException extends Exception {
	MyException(String msg) {   // 문자열을 매개변수로 받는 생성자
    	super(msg);             // 조상인 Exception클래스의 생성자를 호출
    }
}

 

 

예외 되던지기

 

1. 예외가 발생할 가능성이 있는 메서드에서 try-catch문을 사용해서 예외를 처리해주고 catch문에서 필요한 작업을 행한 후에 

throw문을 사용해서 예외를 다시 발생 시킴.

 

2. 다시 발생한 예외는 이 메서드를 호출한 메서드에게 전달되고 호출한 메서드의 try-catch문에서 예외를 또다시 처리

 

-> 예외 발생한 메서드와 이를 호출한 메서드 양쪽 모두에서 처리해줘야 할 작업이 있을 때 사용

 

clas ExceptionEx17 {
	public static void main(String[] args)
    {
    	try {
        	method1();
        } catch (Exception e) {
        	System.out.pirntln("main메서드에서 예외가 처리되었습니다.");
        }
    }
    
    static void method1() throws Exception {
    	try {
        	throw new Exception();
        } catch (Exception e) {
        	System.out.println("method1메서드에서 예외가 처리되었습니다.");
            throw e;
        }
    }
}

 

 

연결된 예외

 

예외 A가 예외 B를 발생시켰다면, A를 B의 '원인 예외'라고 한다.

 

initCause()은 Exception클래스의 조상인 Throwable클래스에 정의됨

Throwable initCause(Throwable cause) 지정한 예외를 원인 예외로 등록
Throwable getCause() 원인 예외를 반환

 

1. 예외가 원인 예외를 포함시키기 위함

2. checked예외를 unchecked예외롤 바꾸기 위함

 

static void startInstall() throws SpaceException {
	if(!enoughSpace()) {
    	throw new SpaceException("설치공간부족");
    }
    
    if(!enoughMemory()) {
    	throw new RuntimeException(new MemoryException("메모리부족"));
    }
}

Runtime 예외가 Memory예외를 감싸버림 -> Memory 예외가 unchecked예외가 됨.

 

댓글