항해99/Java 문법 뽀개기

자바문법뽀개기(14) - 예외, 에러 처리

숲별 2022. 9. 27. 09:45
728x90
    1. 예외처리란(Exception, Error Handling)
    • 코드를 완벽하게 짰다고 해서 항상 프로그램이 성공적으로 도는 것은 아닙니다. 다양한 예외 상황이 발생할 수 있는데요. 이것에 대응하기 위해서 예외 처리 코드가 필요합니다.
    • 예외처리의 목적
      1. 예외의 발생으로 인한 실행 중인 프로그램의 비정상 종료를 막기 위해서
      2. 개발자에게 알려서 코드를 보완할 수 있도록 하게 위해서
    • 자바에서는 상속을 이용해서 모든 예외를 표현합니다. 모든 예외 클래스는 Throwable의 자손 클래스 입니다.
    • Throwable 에는 크게 두 종류의 자식 클래스가 있습니다.
      • Error 는 프로그램이 종료되어야 하는 심각한 문제를 표현합니다. 대부분 컴퓨터나 JVM이 시스템적으로 동작할 수 없는 상황을 표현합니다
      •  💡 Java는 JVM내의 Heap이라는 메모리 공간을 운영체제로부터 할당 받아 사용합니다. 할당 받을 수 있는 최대 메모리 이상을 사용하면, JVM이 다운될 수 밖에 없습니다. 이 경우 OutOfMemoryError가 나면서 프로그램이 종료됩니다. 자바의 대표적인 에러 상황으로 줄여서 OOM이라고도 합니다.
      • Exception 은 프로그램이 종료되지는 않지만 예외나 문제상황을 표현하기 위해 사용합니다.
    • 자바에 미리 정의 되어있는 예외 클래스 들이 있습니다. 기본적으로 이미 있는 것을 사용하시되, 필요한 것으로 표현할 수 없거나 구체적인 목적을 가진 예외를 정의하고 싶다면, Throwable 또는 그 하위에 있는 예외 클래스를 상속받아서 자신만의 예외 클래스를 정의할 수 있습니다. (아래 사진은 자바의 기본 예외 클래스들 중 대표적인 것들의 상속 관계도 입니다.)
  • 여러분이 표현하려는 예외 상황은 대부분 Exception 종류일 것입니다.
  • 실행도중 발생하는 Exception은 RuntimeException을 상속받아서 정의하세요.
  • 파일을 읽고 쓰거나, 원격에 있는 저장소로부터 데이터를 읽고 쓸 때 나는 에러를 표현하려면 IOException을 상속받아서 정의하세요.

 


 

 예외처리(Error Handling, Exception Handling)

 

Error는 프로그램이 종료되어야하는 심각한 문제를 표현.

그래서 종류가 많지 않아.

대부분 컴퓨터나 jvm이 시스템적으로 동작할 수 없는 상황을 표현하는데 사용.

 

ex)JAVA는 jvm 내에 힙(Heap)이라는 메모리 공간을 운영체제로 부터 할당받아 사용

할당받을 수 있는 최대 메모리 이상을 사용하면

jvm은 자기가 저장할 공간이 없으니까 죽어버릴 수 밖에 없는 것.

=>out of memory error라면서 프로그램 종료

자바의 대표적인 에러상황으로 실무자들이 줄여서 OOM이라고 얘기함.

 

에러가 아닌 모든 것들은 사실 excption.

 

catch이하는 앞에서 잡히면 뒤에서 잡지 않기 때문에

더 좁은 범위 먼저 작성(상속관계에서 자식에 해당)

 

public class Main {
    public static void main(String[] args) {
        int number = 10;
        int result;
        for(int i=10; i>=0; i--){
            try{
                result = number/i;
                System.out.println(result);
            }catch (Exception e){
                System.out.println("Exception 발생: "+ e.getMessage());
            }finally {
                System.out.println("항상 실행되는 finally 구문");
            }
        }
    }
}

=>1
항상 실행되는 finally 구문
1
항상 실행되는 finally 구문
1
항상 실행되는 finally 구문
1
항상 실행되는 finally 구문
1
항상 실행되는 finally 구문
2
항상 실행되는 finally 구문
2
항상 실행되는 finally 구문
3
항상 실행되는 finally 구문
5
항상 실행되는 finally 구문
10
항상 실행되는 finally 구문
Exception 발생: / by zero
항상 실행되는 finally 구문

 

 

 

import java.io.FileOutputStream;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        try (FileOutputStream out = new FileOutputStream("test.txt")) {
            out.write("Hello Sparta".getBytes());
            out.flush();
        } catch (IOException e) {
            System.out.println("IOException 발생: " + e.getMessage());
            e.printStackTrace();
        }

    }
}

=>test라는 파일 생성.(내용은 Hello sparta)

여기서 배우려고 한 건 try-with-resource

 

 

위에 걸 try-catch문으로 작성하면

import java.io.FileOutputStream;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException{
        FileOutputStream out = new FileOutputStream("test.txt");
        try  {
            out.write("Hello Sparta".getBytes());
            out.flush();
        } catch (IOException e) {
            System.out.println("IOException 발생: " + e.getMessage());
            e.printStackTrace();
        }
        out.close();

    }
}

file은 파일을 열었다는 뜻. 그러면 항상 닫아줘야 함.

 

 

 

<퀴즈>

class ArrayCalculation {

    int[] arr = { 0, 1, 2, 3, 4 };

    public int divide(int denominatorIndex, int numeratorIndex) throws ArithmeticException, ArithmeticException {
        return arr[denominatorIndex] / arr[numeratorIndex];
    }
}

public class Main {
    public static void main(String[] args) {
        ArrayCalculation arrayCalculation = new ArrayCalculation();

        System.out.println("2 / 1 = " + arrayCalculation.divide(2, 1));
        try{
            System.out.println("1 / 0 = " + arrayCalculation.divide(1, 0)); // java.lang.ArithmeticException: "/ by zero"
        } catch (ArithmeticException arithmeticException){
            System.out.println("잘못된 계산입니다. "+arithmeticException.getMessage());
        }
        try {
            System.out.println("Try to divide using out of index element = "
                    + arrayCalculation.divide(5, 0)); // java.lang.ArrayIndexOutOfBoundsException: 5
        }catch (ArrayIndexOutOfBoundsException arrayIndexOutOfBoundsException){
            System.out.println("잘못된 index 범위로 나누었습니다. 타당 index 범위는 0부터"+(arrayCalculation.arr.length -1+"까지 입니다."));
        }
    }

}

 

강의 자료 : https://www.notion.so/80db7f3685304ab3ac749e0e9cd29b30#1ec7e992c46b4e2c9f0c69d2fe41929e

 

[스파르타코딩클럽] 자바 문법 뽀개기

매 주차 강의자료 시작에 PDF파일을 올려두었어요!

www.notion.so