본문으로 바로가기

Java- 예외

category 프로그래밍 언어/Java 2019. 7. 12. 17:05

1. 예외 처리

흔히 에러에는 여러가지 종류가 있습니다.

 

  • 컴파일 에러는 컴파일 시 발생하고
  • 런타임 에러는 실행을 할 때 발생하고
  • 논리적 에러는 프로그램은 잘 돌아가지만 내가 짰던 의도와는 전혀 다르게 동작하여 개발자를 당혹케 하는 에러를 말합니다.

여기서 에러는 Exception입니다. 즉 다소 약한 정도의 에러를 말하고

 

Error는 심각한 치명적인 에러입니다.

 

출처 : https://finewoo.tistory.com/22 


2. 예외 처리하기

2-1) try~catch

try{
예외 발생 가능 코드
}catch(Exception e){
예외 발생 시 처리 코드
}

흔히 나눗셈을 하는 코드에서 에러가 발생합니다.

 

그 이유는 분모를 0으로해서 나누기 때문이죠. 이를 방지하려면 try~catch문으로 간단히 처리할 수 있습니다.

 

에러 발생
pulic static void main(String[] args) {
  int number = 100;
  int result = 0;

  for (int i = 0; i < 10; i++) {
    result = number / (int) (Math.random() * 10);
    System.out.println(result);
  }
}

즉 0으로 나누어질 수 도 있기 때문에 for문에서 예외처리가 되지 않았습니다.

 

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) {
          System.out.println("0 <- 예외처리");
      }
  }
}

for문 내부에 0으로 나눌 가능성이 있는 코드에 try로 감싸주고 catch로 ArithmeticException이 발생 시 

 

문자를 찍어 줍니다. 즉 에러가 발생 시 catch문으로 들어가게 되죠

 

42
50
13
23
0 <- 예외처리
65
0 <- 예외처리
0 <- 예외처리
21
54

3. 에러 메시지?

printStackTrace() 와 getMessage()가 있습니다.

 

  • printStackTrace(): 예외가 발생하면 스택에 있던 메서드 정보, 메시지 등을 화면에 출력합니다.
  • getMessage(): 발생 예외클래스의 인스턴스에 저장된 메시지 출력합니다.
try{

}catch(Exception e){
	e.getMessage();
    e.printStackTrace();
}

4. 여러개의 catch

여러개의 catch 블럭을 사용하려면 catch문을 계속 열어주어도 되지만 복잡하므로

 

| 조건을 통해 사용합시다.

 

try {
  //...
} catch (Exception1 | Exception2 e) {
  e.printStackTrace();
}

5. 고의로 예외 발생시키기?

예외 객체를 생성 후 throw를 해줍니다.

 

public static void main(String[] args) {
  try {
    Exception e = new Exception("예외 발생!");
    throw e;
  } catch (Exception e) {
    System.out.println("에러메시지 : "+e.getMessage());
    e.printStackTrace();
  }
  System.out.println("정상종료...");
}

6. 예외 확인(확인X)하는 Exception

  • 예외를 확인하는 것은 Exception 클래스들 ==> 런타임 제외
  • 예외를 확인하지않는 것은 RuntimeException 클래스들 ==> 컴파일 정상 진행

7. 메서드 예외

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

매서드 옆에 throws로 예외를 선언합니다.

 

이로인해 자손 까지도 예외가 발생합니다.

 

throws Exception 으로 할 경우 모든 종류 예외가 발생 가능성이 있습니다.

 

즉 예외를 처리하는 것이 아니라 예외를 호출한 메서드에게 전달하는 용도입니다.

 

말그대로 Throw 던지다...

public static void main(String[] args) {
  String fileName = "";
  File file = createFile(fileName);
  System.out.println(file.getName() + "파일이 성공적으로 생성됨.");
}

static File createFile(String fileName) {
  try {
      if (fileName == null || fileName.equals(""))
        throw new Exception("파일이름이 유효하지 않음.");
  } catch (Exception e) {
      fileName = "제목없음.txt";
  } finally {
      File file = new File(fileName);
      createNewFile(file);
      return file;
  }
}

static void createNewFile(File file) {
  try {
    file.createNewFile();
  } catch (Exception e) {

  }
}

위 코드는 직접 예외가 발생한 곳에서 예외를 직접적으로 처리합니다.

즉 메인에서 filename을 공백처리하고 파일을 생성하는 createFile메서드를 호출합니다.

이 때 createFile에서는 try문에서 예외가 발생하여 throw를 합니다. 이에 따라 catch문으로 가게되고

제목없음.txt가 fileName에 담깁니다. 그리고 finally로 가서 예외 처리 후 작업을 진행하여 파일을 생성합니다.

따라서 결과는

제목없음.txt파일이 성공적으로 생성됨.

8. 사용자 정의 예외

Exception 클래스를 상속받아 정의합니다.

class MyException extends Exception {
  MyException(String msg) {
    super(msg);
  }
}

public class NewExceptionTest {
    public static void main(String[] args) {
        try {
            startInstall();
            copyFiles();
        } catch (SpaceException se) {
            System.out.println("에러메시지 : " + se.getMessage());
            se.printStackTrace();
            System.out.println("공간을 확보해주세요.");
        } catch (MemoryException me) {
            System.out.println("에러메시지 : " + me.getMessage());
            me.printStackTrace();
            System.out.println("메모리가 부족합니다.");
        } finally {
            deleteTempFiles();
        }
    }

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

    static void copyFiles() {};

    static void deleteTempFiles() {};

    static boolean enoughSpace() {
        // 설치 공간이 충분한지 판단하는 코드 작성
        return false;
    };
    static boolean enoughMemory() {
        // 설치 메모리가 충분한지 판단하는 코드 작성
        return true;
    };
}
class SpaceException extends Exception {
    SpaceException(String msg) {
        super(msg);
    }
}
class MemoryException extends Exception {
    MemoryException(String msg) {
        super(msg);
    }
}

사용자 정의 예외클래스 SpaceExcetpion과 MemoryException을 정의합니다. 

 

위에서 에러 발생시 throw로 전달하고 메시지를 받아 이를 catch문에서 받아 이용합니다.

 

'프로그래밍 언어 > Java' 카테고리의 다른 글

Java- 컬렉션 프레임워크(ArrayList)  (0) 2019.07.15
Java - 컬렉션 프레임워크  (0) 2019.07.15
Java- 인터페이스  (0) 2019.07.11
Java- 추상클래스  (0) 2019.07.10
Java - 다형성  (0) 2019.07.10