Java/Java

자바 예외처리

code2772 2022. 10. 6. 23:40
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;
    }
}
반응형