본문 바로가기
Java/Java

자바 예외처리

by code2772 2022. 10. 6.

[ 목차 ]

    728x90
    반응형
    2. 예외 처리(Exception)
    
    오류(error)
    자바 컴파일러에 의해 문법 오류를 발생
    
    예외(exception)
    문법이 맞게 작성되었다 하더라도 프로그램을 실행하면서 예상하지 못한 오류가 발생
    프로그램 실행 중 비정상적으로 종료
    예측할 수 있는 예외, 예측 못하는 예외
    
    ✔ 예외가 발생하는 원인
    - 사용자가 잘못된 데이터를 입력하는 경우
    - 개발자가 로직이나 계산을 잘못 작성한 경우
    - 하드웨어나 네트워크가 제대로 동작하지 못하는 경우
    - 악의적으로 잘못된 연산을 요구하거나 시스템을 공격
    
    예외의 종류 - 예외 상황에 맞춰 문제를 처리하기 위해 다양한 예오처리가 있다.
    - 컴파일시에 예외 발생
    - 런타임시에 예외 발생
    
                                [Exception] // 모든 예외를 처리
    
         [IOExcerption]  [FileNotFoundException] ... [RuntimeException]
    
    예외처리 코드
    
        try{
            실제 코드가 들어가는 곳으로 예외 상황이 발생할 가능성이 있는 코드
            ....
            예외 발생!
            ....  <------ 예외가 발생하면 이곳으로 오지 않음
            ....
        }catch(예외객체타입1 참조변수1){
            try 블록에서 예외 객체 타입1의 Exception이 발생하면 여기로 오게 됨
            해당 코드를 실행 후 에러없이 벗어남
            ......
        }catch(예외객체타입1 참조변수1){
            try 블록에서 예외 객체 타입1의 Exception이 발생하면 여기로 오게 됨
            해당 코드를 실행 후 에러없이 벗어남
            ......
        }
        ...
        finally{ // 무조건 실행하는 문장으로 필수는 아니다.
        try블록에서 Exception 발생과 관계없이 무조건 실행되는 코드(옵션)
        }
    
    

     

    public class Exception3 { // 캄파일시 발생하는 에러
        public static void main(String[] args) {
            try {
                Class obj = Class.forName("com.koreaot.test");
            } catch (ClassNotFoundException e) {
                e.printStackTrace(); // 어떤 예외가 발생했는지 알려줌
            }
            System.out.println("프로그램이 정상적으로 종료되었습니다.");
    
        }
    }

     

    public class Exception1 {
        public static void main(String[] args) {
    
            try {//실제 코드가 들어가는 곳으로 예외 상황이 발생할 가능성이 있는 코드
    //            int num=10;
    //            int result =num/0;
    //            System.out.println(result);
    
    //            String str = null;
    //            System.out.println(str.length());
    
    //            int [] num = new int[3];
    //            num[0] =100;
    //            num[3] =10;
    
                String str = "천";
                System.out.println(Integer.parseInt(str));
            } catch (ArithmeticException ae) {
                System.out.println("0으로 나눈 예외상황 발생");
            } catch (NullPointerException ne) {
                System.out.println("객체를 정의하지 않음");
            } catch (ArrayIndexOutOfBoundsException ae) {
                System.out.println("인덱스를 벗어남!");
            } catch (NumberFormatException nfe) {
                System.out.println("숫자로 변환하지 못한다");
            } catch (Exception e) {
                // 여러 예외상황이 있으면 가장 마지막에 작성해야한다.
                //모든 예외를 처리하는데 다른 예외가 하위에 있으면 오류가 발생하기 때문이다.
                System.out.println("모든 예외를 처리!");
            }
    
            System.out.println("프로그램을 정상적으로 종료합니다.");
    
        }
    }

     

    문제.
    Scanner로 입력을 받아 해당 데이터가 숫자면 숫자를 출력, 문자면 -1을 출력하는 프로그램을 만들어보자
    (단, 예외처리를 사용하여 작성)
    import java.util.InputMismatchException;
    import java.util.Scanner;
    
    public class ExceptionTask {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int value = 0;
            try {
                System.out.println("숫자를 입력하세요 : ");
                value = sc.nextInt();
    
    
            } catch (InputMismatchException im) {
                value = -1;
            } finally {
    
                    System.out.println("value : " + value);
                }
            }
    
        }
    

     

    ✔ throw
    강제로 예외를 발생시키고자 할 때 사용
    현재 메소드의 예외를 처리한 후 상위 메소드에 예외 정보를 전달함
    
    강제로 예외를 방생시키는 방법
        Exception 참조변수 = new Exception("예외가 발생하면 출력될 문자열")
        ...
        ...
        throw 참조변수; // 예외발생!

     

    public class Exception4 {//throw 예제
        public static void main(String[] args) {
            Exception e = new Exception("예외를 발생합니다!!!");
    
            try{
                throw e; // 강제로 예외를 발생시킴
            }catch (Exception ex){
                ex.printStackTrace();// 어떤 예외가 발생했는지
            }
            System.out.println("프로그램이 정상적으로 종료");
        }
    }
    

     

    ✔ throws
    현재 메소드에서 자신을 호출한 상위 메소드로 예외를 발생시킴
    사용하는 메소드를 호출한 상위 메소드에서 예외처리에 대한 책임을 맡김
    
    public class Exception5 {//throws 예제
        public static void main(String[] args) throws Exception {
            method1();// 끝까지 책임을 회피하면 JVM이 처리한다.
            //이러면 어떤 에러가 나는지 모른다.
        }
        public static void method1() throws Exception{
            method2();
        }
        public static void method2() throws Exception{
            method3();
        }
        public static void method3() throws Exception{
            System.out.println("method3() 호출!");
            Exception e = new Exception("예외발생");
            throw e;
        }
    }
    
    반응형