출처 : https://www.youtube.com/watch?v=HZL4iUUx4_E

 

안녕하세요! 또 다시 새로운 강의 정리로 돌아온 쏘코입니다.

오늘부터는 자바의 예외처리에 대한 내용에 대해 공부해보려고 합니다.

지금까지는 예외사항이 나오면 설명하지 않고 이런게 있다 정도로만 하고 넘어갔는데, 이제는 피할 수 없겠네요.

저와 함께 예외사항도 확실히 이해하고 넘어가도록 노력해보자구요 :)

 

목차


    0. 에러와 예외

    에러프로그램이 동작하는 환경에서 문제가 생겨서 프로그램이 정상적으로 작동하지 않는 것을 의미합니다.

    예를 들면 메모리가 부족하다든가, 전기가 갑자기 나갔다든지..

     

    반대로 예외우리가 짠 코드가 의도한 것과 다른 상황에 직면했을 때를 말합니다. 

    예를 들면 파일을 읽을 때 우리는 파일이 있을 것이라고 간주했는데 파일이 없다든지..

     

    앞으로의 포스팅은 예외에 대해서 다루는 포스팅이 될 것입니다.

    이런 예외 상황을 처리한다면, 보다 좋은 코드를 만들 수 있겠죠?!

     


    1. 예외의 발생

    ProjectException이라는 프로젝트 폴더를 하나 만들고, 그 안에 ExceptionApp이라는 클래스를 하나 만들어줍시다.

     

    여기다가 일반적인 프로그램을 하나 짜 보겠습니다.

    1,2,3을 출력하는 프로그램입니다.

     

     

    그런데 여기서 사용자로부터 0을 받아서 2를 0으로 나눈 값을 출력하게 된다면 어떻게 될까요?

    2를 0으로 나누는 것은 불가능합니다.

    예외상황이 발생한 것이죠.

     

     

    예외상황이 발생하면 그 위치에서 예외가 발생했다고 콘솔창에 뜨게 됩니다.

    컴파일러는 코드가 적혀있는 순서대로 읽기 때문에 2/0 계산의 위에 위치하는 1은 정상적으로 출력이 되었죠?

    2/0을 출력해야 하는데, 0으로 나눴기 때문에 / by zero라는 예외가 발생했음을 우리는 콘솔창을 통해 알 수 있습니다.

    3은 실행되지 않죠.

     

     

    만약 예외가 발생했다는 말만 콘솔창에 띄우고 프로그램을 계속 실행한다면 심각한 문제가 발생할 수 있습니다.

    그 위치에서 멈추지 않으면 문제의 위치를 정확하게 파악하기 어려워지기 때문입니다.

     

    이렇게 예외가 발생했으면, 이 예외 사항에 따라 프로그램을 다르게 처리할 수 있으면 좋겠죠?

     


    2. 예외의 처리

    만약 어느 부분에서 예외가 발생할 것 같으면 try catch문을 통해 그 부분을 격리시킵니다.

    try에는 우리가 의심하는 그 부분이 들어가게되고,

    catch에는 예외가 있는 경우 대신 처리되는 부분이 들어갑니다.

    catch의 매개변수로는 예외가 들어가고, 뒤의 e 자리에는 아무거나 들어가도 상관이 없지만 exception의 줄임말인 e를 넣는 것이 일반적입니다.

    위에서 ArithmeticException이 발생한다는 것을 파악했기 때문에 예외 코드가 ArithmeticException형태라면 "잘못된 계산이네요."를 출력하도록 만들었습니다.

     

    정상적으로 예외처리가 되어 프로그램이 작동하는 모습!

     

    이번엔 또 다른 예외를 만들어보겠습니다.

    배열에서 없는 값을 출력하면 과연 어떤 예외가 나올까요?

    바로 ArrayIndexOutOfBoundsException 예외가 나오게 됩니다.

     

     

    같은 방식으로 예외를 처리하면 아래와 같이 작동하게 됩니다.

     

     

    이제 try catch문 2개를 합쳐보겠습니다.

    우리의 예상과는 다르게, "잘못된 계산이네요."는 출력되지 않습니다.

    try문을 쭉 진행하다가 한번 예외가 발생하면

    그 아래의 문장들은 실행이 되지 않고 바로 catch문으로 넘어간 후에 try catch문을 빠져나가 버립니다.

     

     

    public class ExceptionApp {
    
    	public static void main(String[] args) {
    		
    		
    		
    		int[] scores = {10, 20, 30};
    		System.out.println(1);
    		try {
    			System.out.println(scores[3]);
    			System.out.println(2/0);
    		} catch(ArithmeticException e) { // 0으로 나눴을 때의 에러가 발생하면 에러처리
    			System.out.println("잘못된 계산이네요.");
    		} catch(ArrayIndexOutOfBoundsException e){
    			System.out.println("없는 값을 찾고 계시네요 ^^");
    		}
    		System.out.println(3);
    
    	}
    
    }

     


    3. 예외의 우선순위

    이번에는 exception을 처리하기 귀찮을 때 쓸 수 있는 방법입니다.

    (따라서 좋은 방법은 아닙니다..)

     

    하나의 catch모든 것을 처리하게 하고 싶을 수 있습니다.

     

    우리가 ArithmeticException을 사용했었죠?

    ArithmeticException의 설명서를 보러 갑시다.

    그럼 ArithmeticException 클래스의 부모 클래스중에 Exception이 있습니다.

     

     

    또한 ArrayIndexOutOfBoundsException을 찾아보면 Exception을 부모 클래스로 가지고 있습니다.

     

     

    이 말은, 우리가 예외로 Exception을 받는 케이스를 고려하면 두 케이스를 모두 예외처리 할 수 있다는 이야기가 됩니다.

    실제로 try catch문에 예외로 Exception을 적으면 나머지 두 예외에 빨간 밑줄이 쳐집니다.

    아래 catch문 2개는 작동할 리가 없기 때문에 생기는 빨간 밑줄입니다!

     

     

    이제 아래 두 catch문을 지우고 첫 번째 catch문만 살리면 아래와 같이 동작하게 됩니다.

     

     

    try문의 2번째 줄을 주석처리해도 2/0에 걸려서 똑같이 예외처리가 되는 모습입니다.

     

     

    만약 ArithmeticExcpetion이 조건문으로 담겨있는 catch문이 Exception이 조건문으로 담겨있는 catch문보다 앞에 있으면 어떻게 될까요?

    컴파일러는 코드를 위에서부터 순서대로 읽기 때문에 ArithmeticException 예외가 발생하는 경우 더 위에 있는 catch문이 동작해서 "계산이 잘못된 거 같아요."가 출력됩니다.

     

    catch문의 순서, 그 다음엔 상속 여부에 따라서 예외의 우선순위가 결정되는 것이죠!

     

    public class ExceptionApp {
    
    	public static void main(String[] args) {
    		
    		
    		
    		int[] scores = {10, 20, 30};
    		System.out.println(1);
    		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("계산이 잘못된 것 같아요.");
    		} catch(Exception e) {
    			System.out.println("뭔가 이상합니다. 오류가 발생했습니다!!");
    		}
    		System.out.println(5);
    
    	}
    
    }

     


    이번 포스팅에서는 예외의 특성과 예외를 처리하는 방법에 대해서 알아봤습니다.

    다음 시간에는 아직 공부하지 않은 e와 다른 예외사항들에 대해서 알아보도록 하겠습니다!

     

    오늘도 읽어주셔서 감사합니다!! 😊😊

    반응형
    • 네이버 블로그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기