ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 알기 쉬운 JAVA 예외 처리(Exception) 1. try ~ catch문에 대해 알아보자
    프로그래밍/JAVA 2020. 5. 11. 17:20

    예외 처리(Exception)

     

    개발에 있어서 오류가 나는 것은 당연한 일이다. 오류가 나기 때문에 무엇이 잘못되었는지 확인할 수 있다.

     

    예외란 프로그램이 진행하는 과정에서 만나게 되는 가벼운 정도의 오류로서 사용자의 잘못된 입력이나 배열의 인덱스가 배열의 크기를 넘어가는 등, 예기치 못한 상황에 의해 프로그램 실행 중에 발생한다.

     

    자바에서 문법에 맞지 않게 작성된 코드는 사전에 컴파일러에 의해 컴파일 오류(compile time error)로 

    걸러지지만, 예외는 컴파일은 잘 되지만 실행 중에 발생하게 된다.

     

    예외의 상속도

        Object 
    	+----- Throwable 
    		  +----- Eroor
    		  +----- Exception 
                                 +----- RuntimeException // 컴파일은 되지만, 실행했을 때 예외 발생
                            	          +----- NullPointerException
                                              +----- ArithmeticException
                                              +----- ArrayIndexOutOfBoundsException
                                              +----- ...
               		     +----- IOException 
                         	        	  +----- FileNotFoundException
                          	     +----- ... 등 컴파일 타임에 체크되는 Exception

     

    예외 처리 방법

    1) Try ~ catch문을 이용하여 직접 예외를 처리하는 방법

    2) throws 절을 이용하여 선언하는 방법

    등이 있다.

    여기서는 Try ~ catch문을 이용해서 예외를 처리하는 방법을 알아보고자 한다.

     

    1. 배열(ArrayIndexOutOfBoundsException)의 예외처리

    public class Main {
    	public static void main(String[] args) {
        
        	String[] fruits = {"사과", "배", "포도"};
            
            for(int i=0;i<5, i++)
            	System.out.println(fruits[i]);
    	)
    }
    

    배열의 크기보다 큰 인덱스로 배열의 원소에 접근한 코드이다. 컴파일 시에는 문제가 없지만

    실행시켜보면 

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
    	at day18.ExceptionTest1.main(ExceptionTest1.java:13)

    ArrayIndexOutOfBoundsException 예외가 발생한다. 

     

    예외를 처리하기 위해 예외가 발생할 수 있는 코드를 try ~ catch문으로 감싼다.

    catch절의 ()안에는 발생한 예외클래스를 참조하는 매개변수 e를 작성한다.

     

    만약 NullPointException이 발생했다면 catch()절에는 catch(NullPointException e)를 작성한다.

    public class Main {
     	public static void main(String[] args) {
              String[] fruits = {"사과", "배", "포도"};
    
              try {
                  for(int i=0;i<5;i++)
                      System.out.println(fruits[i]);
              }catch(ArrayIndexOutOfBoundsException e) {
                  // 예외 처리 코드 작성
                  System.out.println("배열 인덱스 범위 초과.");
              }
    
              System.out.println("###반드시 실행되어야 할 코드###");
    
    	}
    }

    출력

    사과
    배
    포도
    배열 인덱스 범위 초과됐어요! 확인해보세요!
    ###반드시 실행되어야 할 코드###
    

    실행결과를 보면 try{}에서 예외가 생긴 코드를 감지하고 catch{}에서 예외를 처리하는 코드를 작성하여 

    사용자가 알 수 있도록 해준다. 또한 예외가 발생한 다음의 코드는 출력되지 않았지만 예외처리를 통해

    다음 코드를 실행한 것을 볼 수 있다.

     

    2. 여러개의 예외를 한번에 처리해보자

     

    정수를 입력받는 코드를 작성하고 50을 입력받은 정수로 나누는 코드를 작성하였다.

    public class Main {
    	public static void main(String[] args) {
    			// 정수를 입력받는 코드
    			String str = JOptionPane.showInputDialog("정수를 입력하세요");
    			 
                   		// 받은 정수를 Integer로 형변환
    			int num = Integer.parseInt(str);
                		// 입력받은 정수로 50을 나눈다.
    			int k = 50/num;
    			System.out.println(k);
    			
    			String s = null;
    			System.out.println(s.toUpperCase());
    			
    		
    		System.out.println("###The End###");
    		
    	}
    }

    예외 발생

    - 정수에 0을 입력하면 50/0이 되므로 예외(연산오류)가 발생한다. (ArithmeticException)

    - 정수 대신 문자열을 입력한 경우도 예외가 발생하게 된다. (NumberFormatException)

    - 기타 예상치 못한 예외가 발생 할 수 있다. (Exception)

     

    이렇게 여러가지 예외가 발생할 경우 catch절을 여러개 사용해서 코드를 작성할 수 있다.

     

    예외를 처리할 때 규칙이 있다. 자식 클래스의 예외를 먼저 catch절로 잡아주고 더 높은 부모 클래스의 예외를 작성해줘야 한다.

    public class Main {
        public static void main(String[] args) {
    		try {
    			String str = JOptionPane.showInputDialog("정수를 입력하세요");
    			
    			int num = Integer.parseInt(str);
    			int k = 50/num;
    			System.out.println(k);
    			
    			String s = null;
    			System.out.println(s.toUpperCase());
    			
    		} catch(NumberFormatException e) {
    			System.out.println("입력 오류! 숫자를 입력해야 해요");
    		} catch(ArithmeticException e) {
    			System.out.println("입력 오류! 0 이외의 값을 넣어주세요");
    			return;
    		} catch(Exception e) { // 예상치 못한 오류 잡을 때 상위 클래스 Exception 쓴다.
    			System.out.println("기타 예상치 못한 오류 발생: "+e);
    			System.exit(-1); // 시스템 종료
    	}
    }

    NumberFormatException과 ArithmeticException을 먼저 작성해주고 그 상위 클래스인 Exception을 마지막에 작성해준다.

    예외 처리 목적

    자바에서는 예외를 클래스로 묶어서 사용하고 있다. 그렇다면 각각의 예외를 처리하는 코드를 작성하지 말고 그 상위 클래스인 Exception을 써주면 되는 것 아니냐고 생각할 수 있다. 하지만 예외 처리의 목적은 에러를 잡는 것이 아니라 무엇이 에러인지 구체적으로 알려주기 위함이다.

    댓글

Designed by Tistory.