algoqna

[JAVA] 예외처리 본문

JAVA

[JAVA] 예외처리

kkalgo 2023. 1. 25. 13:48

[에러와 예외] : 어떤 원인에 의해 오동작 하거나 비정상적 종료

  • Error : 메모리 부족, stack overflow와 같이 발생하면 복구할 수 없는 상황
    • 프로그램의 비정상적 종료를 막을 수 없으므로 디버깅을 잘 해야한다.
  • Exception : 읽으려는 파일이 없거나, 네트워크 연결이 안되는 등. 수습될 수 있는 비교적 상태가 약한 것들
    • 프로그램 코드에 의해 수습될 수 있는 상황
    • checked exception : 예외에 대한 대처코드가 없으면 컴파일이 진행되지 않음
    • unchecked exception : 예외에 대한 대처코드가 없더라도 컴파일은 진행
  • try catch 코드
try {
// 예외가 발생할 수 있는 코드
} catch(XXException e) {// 던진 예외를 받음// 예외가 발생했을 때 처리할 코드
}
  • Throwable의 주요 메서드
    • public String getMessage() : 발생된 예외에 대한 구체적인 메시지를 반환
    • public void printStackTrace() : 예외가 발생된 메서드가 호출되기까지의 메서드 호출 스택을 출력한다.
    • try블록에서 예외가 발생하면 jvm이 해당 exception 클래스의 객체 생성 후 던짐(throw)
    • throw new XXException()
      • 던져진 exception을 처리할 수 있는 catch 블록에서 받은 후 처리
      • 정상적으로 처리되면 try-catch 블록을 벗어나 다음 문장 진행

 

 

  • 다중 exception handling
  • try 블록에서 여러 종류의 예외가 발생할 경우 하나의 try 블록에 여러 개의 catch 블록 추가 가능
    • 상위 타입의 예외가 먼저 선언되는 경우 뒤에 등장하는 catch 블록은 동작할 기회가 없음
    • 상속 관계가 없는 경우는 무관
    • 작은 범위에서 큰 범위로 작성하자.
  • 예외 발생 여부가 중요한 것이 아닌 예외가 발생 시 어떻게 할 것인가? 가 중요하다.
  • finally : 예외 발생 여부와 상관 없이 언제나 실행
    • 중간에 return을 만나도 finally 블록을 수행 후 리턴
    • try 선언문에 선언된 객체들이 AutoCloseable interface를 구현되 있다면 finally 역할

Exception 처리 법

  • try - catch
  • catch에서 복구문장이 한 개도 없어도, JVM은 살아나게 설계되어있다.
  • getMessager() : 시스템 정보 노출, 공백 : 에러상황 대응부재, printStackTrace : 에러 정보 노출
  • 즉, catch 문에서는 에러 코드 테이블 준비와, 복구 코드가 있어야함.
  • throws
    • main method에서 throws를 하면 안된다..?
    • 서버와 클라이언트는 각각 JVM이 있는데 서버쪽에서 발생한 에러에 대해서 try, catch를 처리를 하고 클라이언트에 넘겨주면 클라이언트쪽 JVM은 오류가 난 사실에 대해 전혀 모름
    • 그래서 서버 -> 클라이언트로 throws 해주어야 한다.
public class Test {

	public static void main(String[] args) {
// TODO Auto-generated method stubint y;
		int x = 100;
		y= Integer.parseInt(args[0]);
		try {
			Divider.divide(x, y);
		} catch (MyException e) {
// TODO Auto-generated catch block
			System.out.println(e.getMessage());
		}

		System.out.println("더 중요한 일 시작...");
	}

}

class Divider {
	public static void divide(int x,int y) throws MyException{
		if (y == 0) {// 비상사태 전에 일부로 비상사태를 만들었다.throw new MyException("ERROR-09");
		}
		System.out.println(x/y);
	}
}

class MyException extends Exception
{

	public MyException(String message) {
		super(message);
// TODO Auto-generated constructor stub
	}

}

finally는 try 안에서 반드시 해야할 것들을 해주는 역할. 자원 낭비가 되지 않도록

'JAVA' 카테고리의 다른 글

[JAVA] pair 생성 후 정렬  (0) 2023.02.17
[JAVA] Call by value  (0) 2023.02.08
[JAVA] 놓치고 있는 점 정리  (0) 2023.02.06
[JAVA] String  (0) 2023.01.17
[JAVA] 데이터타입, 형변환  (0) 2023.01.16