course/생활코딩

[JAVA 예외]

hjkim0502 2022. 7. 23. 20:37
  • error: 환경적인 오류, exception: 코드 오류

 

  • try ... catch 구문
  • 예외 발생 시 그 아래의 코드는 실행하지 않음, 예외 처리하면 실행 함
  • 예외 계층에 따른 우선순위 존재, 기본적으로 try에 가까운 순서로 실행
  • try 내부에서 실행하다 예외 발생하면 try 내부의 그 이후 코드들은 실행되지 않음
public class ExceptionApp {
    public static void main(String[] args) {
        System.out.println(1);
        int[] scores = {10,20,30};
        try {
            System.out.println(2);
//            System.out.println(scores[3]);
            System.out.println(3);
            System.out.println(2 / 0);
            System.out.println(4);
        } catch(ArithmeticException e){
            System.out.println("계산이 잘못된 것 같아요."+e.getMessage());
            e.printStackTrace();
        } catch(Exception e){
            System.out.println("오류가 발생했습니다. ");
        }
        System.out.println(5);
    }
}

 

  • checked exception: Exception의 직계 자손 클래스 중 RuntimeException을 제외한 클래스들 (대표적으로 IOException) -> 예외 처리해야 컴파일 가능
  • unchecked exception: RuntimeException은 예외 처리하지 않아도 컴파일 됨, 예외 발생 시 알려줌

 

  • 외부의 resource를 사용할 때는 예외에 더 취약함
    • 예) 파일에 접근할때는 보통 독점적으로 작업하기 때문에, 종료 후 권한을 내려놓아야 함
    • 이때 close() 관련해서 코드가 지저분해짐
    • finally는 예외 처리 여부와 관계없이 무조건 실행됨
import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;

import java.io.FileWriter;
import java.io.IOException;

public class CheckedExceptionApp {
    public static void main(String[] args) {
        FileWriter f = null;
        // try catch finally
        try {
            f = new FileWriter("data.txt");
            f.write("Hello");
        } catch(IOException e){
            e.printStackTrace();
        } finally {
            // 만약에 f가 null이 아니라면
            if(f  != null) {
                try {
                    f.close();
                } catch(IOException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

/////////////////////////////////////////////////
import java.io.FileWriter;
import java.io.IOException;

public class TryWithResource {
    public static void main(String[] args) {
        // try with resource statements
        try (FileWriter f = new FileWriter("data.txt")) {
            f.write("Hello");
        } catch(IOException e){
            e.printStackTrace();
        }
        // close() 작업을 내부적으로 수행해줌
    }
}

 

  • 예외 발생 및 회피
// 예외 회피
// 해당 메소드를 호출한 메소드에서 예외 처리 해야함
import java.io.FileWriter;
import java.io.IOException;

public class ThrowException {
    public static void main(String[] args) throws IOException {
       FileWriter f = new FileWriter("./data.txt");
    }
}

// 예외 발생
import java.io.FileWriter;
import java.io.IOException;

public class MyException {
    public static void main(String[] args){
        throw new RuntimeException("무언가 문제가 있습니다");
    }
}

 

출처: https://www.youtube.com/playlist?list=PLuHgQVnccGMCrFJLxpjhE0N5tvOVxJuVB