Deperecated/JAVA

JAVA - 예외 처리

누알라리 2020. 1. 10. 18:28

음.. 나름 C++ 꽤나 쓴다는 곳에서 근무했었는데.. 예외 처리는 많이 접해보지 않았다.

런타임에서 크래쉬가 나면 Null처리를 하지않은 경우가 굉장히 많아서 맨날 If문으로 Flag처리만 했었는데

C++, JAVA 둘 다 있는 개념이니 빠른 정리가 필요하다..! 오늘도 깨닫는 경험 부족으로 인한 지식 부족 흑흑..


JAVA에서는 예외를 클래스로 관리하기 때문에, 모든 예외 클래스는 java.lang.Exception 클래스를 상속한다.

 

1. 일반 예외(Exception)

- 컴파일러가 처리하는 예외

 

2. 실행 예외(Runtime Exception)

- 컴파일러가 처리하지 않기 때문에 개발자의 역량으로 처리 코드를 삽입해야 한다.

 

3. 예외 처리 코드 (try - catch - finally)

try
{
	// 예외가 발생할 수 있는 코드

} catch(예외클래스 e)
{
    // 자바는 예외를 클래스로 관리하기 때문에, 예외클래스 e가 발생할 경우
    // catch문으로 들어온다.

} finally
{
	// 항상 실행;
}


1. 정상 실행되었을 경우

try -> finally

2. 예외가 발생되었을 경우

try -> catch -> finally

4. 예외 종류에 따른 코드

4-1) 다중 Catch

try
{
    ArrayIndexOfBoundsException 발생
    
    NumberFormatException 발생
}
catch(ArrayIndexOfBoundsException e)
{
	예외처리 1
}
catch(NumberFormatException e)
{
	예외처리 2
}

- try 블록에서 하나의 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하기 때문에 단 하나의 catch 블록만 실행된다.

- 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야한다. 왜냐면 하위 예외는 상위 예외를 상속했기 때문에 상위 예외에도 걸릴 수 있기 때문이다. 그러면 정확한 예외처리를 할 수 없겠지!

 

4-2) 멀티 Catch

try
{
    ArrayIndexOfBoundsException 발생
    
    NumberFormatException 발생
    
    다른 Exception 발생
}
catch(ArrayIndexOfBoundsException | NumberFormatException e)
{
	예외처리 1
}
catch(Exception e)
{
	예외처리 2
}

- Catch 괄호 안에 여러개의 예외클래스를 넣어줄 수 있다.

 

5. 자동 리소스 닫기( try - with - resources)

- 리소스 객체가 java.lang.AutoCloseable 인터페이스를 implements 하고 있다면, try-with-resources 메소드는 자동으로 리소스.close() 메소드를 호출한다.

 

6. 예외 떠넘기기(throws)

- throws 키워드는 메소드에서 처리하지 않은 예외를 "호출한 곳"으로 "떠넘기는" 역할을 한다.

- 메소드 선언부 끝에 작성된다.

리턴타입 메소드명(매개변수, ...) throws 예외클래스 1, 예외클래스 2 ...
{
}

- throws 키워드가 붙어있는 메소드는 반드시 try 블록 내에서 호출되야만 한다.

- catch 블록에서는 떠넘겨 받은 예외를 처리해야 한다.

public void method1
{
	try
    {
    	method2(); // try 블록 안에서 호출
    } catch(Excetion e)
    {
       //예외 처리 코드
       System.out.println("오류가 발생하였습니다!");
    }
}

public void method2 throws Exception
{
	// 여기서 예외가 발생하면 호출된 method1()의 catch 블록에서 예외를 처리한다.
	Class clazz = Class.forName("java.lang.String2");
}

7. 사용자 정의 예외 클래스 선언

- 컴파일러가 체크하는 일반 예외는 Exception을 상속

- 컴파일러가 체크하지 않는 런타임 예외는 Runtime Exception을 상속

 

public class MadeByHyunndyException extends [ Exception | RuntimeException ]
{
    public MadeByHyunndyException() { }
    public MadeByHyunndyException(String Message) { super(Message); }
}


필드, 생성자, 메소드 다 포함할 수 있지만 기본적으로 2개의 생성자를 포함한다.

밑의 매개변수 Message 생성자의 용도는 catch 블록에서 예외를 처리하기위함이다.

8. 예외 발생시키기(throw)

throw new MadebyHyunndyException();
throw new MadeByHyunndyException("메세지");

- 코드에서 예외를 발생시키려면 throw 키워드로 지정한 예외클래스를 생성해주면 된다.

 

public void method() throws MadeByHyunndyException
{
	throw new MadeByHyunndyException("오류발생시키기");
}

try
{
	method();
}
catch(MadeByHyunndyException e)
{
	//예외처리
    
    String message = e.getMessage(); // 예외처리코드에 들어있는 간단한 예외메세지 받기.
    
    e.PrintStackTrace(); // 예외의 발생 경로를 추적
}

'Deperecated > JAVA' 카테고리의 다른 글

JAVA - 주요 API 정리  (0) 2020.01.16
JAVA - 중첩 클래스&중첩 인터페이스  (1) 2020.01.11
JAVA - 익명 구현 객체, 람다식  (0) 2020.01.09
JAVA - 인터페이스  (0) 2020.01.09
JAVA - 어노테이션  (0) 2020.01.09