음.. 나름 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 |