CodeGym/Java Blog/무작위의/Java 예외 발생
John Squirrels
레벨 41
San Francisco

Java 예외 발생

무작위의 그룹에 게시되었습니다
회원
우리가 가는 곳마다 예측할 수 없는 사건들이 우리를 기다리고 있습니다. 지진, 사람들의 비합리적인 행동, 운석... 또는 더 간단한 것 — 전구가 타버리고, 은행 카드의 자기가 사라지고, 휘발유 게이지가 파손됩니다. 예측할 수 없는 사건을 비활성화할 수는 없지만 최소한 부분적으로 대비할 수는 있습니다. 즉, 우리는 이를 처리하기 위한 특정 메커니즘을 준비해야 합니다. 프로그래밍 세계, 특히 Java 언어에서는 프로그램이 정상적으로 작동하지 못하게 하는 이벤트를 예외라고 하며, 프로그램 충돌을 방지하는 메커니즘을 예외 처리라고 합니다. 따라서 프로그램에서 0으로 나누기와 같은 예상치 못한 이벤트가 발생하면 예외가 "발생"해야 합니다. 예외 처리는 개발자가 프로그램 실행 중에 발생할 수 있는 오류와 예외를 관리하는 데 도움이 되는 Java 프로그래밍의 중요한 측면입니다. 이 기사에서는 예외 처리의 기본 개념 중 하나인 Java throw 키워드와 이를 사용하여 예외를 발생시키는 방법에 중점을 둘 것입니다.

Java의 예외란 무엇입니까?

예외는 프로그램 명령의 정상적인 흐름을 방해하는 프로그램 실행 중에 발생하는 이벤트입니다. 예외가 발생하면 프로그램 실행이 중단되고 콘솔에 오류 메시지가 표시됩니다. Java에는 체크된 예외와 체크되지 않은 예외의 두 가지 유형이 있습니다. 확인된 예외는 컴파일 타임에 확인되며, 컴파일러는 호출 메서드에서 해당 예외가 포착되거나 선언되었는지 확인합니다. 반면에 확인되지 않은 예외는 컴파일 타임에 확인되지 않으며 포착되거나 포착되지 않은 채로 남아 있을 수 있습니다. 다음은 오류가 발생할 수 있지만 컴파일러가 이를 건너뛰는 코드의 예입니다.
public class Factorial {
   public static long getFactorial(final int number) {
           long fact = 1;
           for (int i = 1; i <= number; i++) {
               fact = fact * i;
           }
           return fact;
   }

   public static void main(String[] args) {
       System.out.println(getFactorial(-5));
       System.out.println(getFactorial(21));

   }

}
프로그램의 출력은 다음과 같습니다.
1 -4249290049419214848
프로그램은 올바르게 종료되었지만 잘못된 결과가 나왔습니다. 첫 번째 경우에는 함수 인수가 음수이고 계승이 음수에 대해 작동하지 않기 때문입니다. 두 번째 경우에는 숫자가 너무 커서 long 유형의 범위에서 계승을 계산할 수 없기 때문에 결과가 잘못되었습니다. 여기 또 다른 예가 있습니다. 한 숫자를 다른 숫자로 나누는 프로그램을 작성해 봅시다.
public class DivisionExample {

       public static void main(String[] args) {
           int a = 10;
           int b = 0;
           int result = divide(a, b);
           System.out.println(result);
       }

       public static int divide(int a, int b) {
           return a / b;
       }
}
이 예에서는 변수 b가 0이기 때문에 ArithmeticException 이 발생합니다. 그러나 이 오류는 처리되지 않으므로 프로그램이 잘못된 상태로 종료됩니다.

Java에서 예외를 발생시키는 방법

Java에서는 예외도 객체이므로 새 Exception 객체가 생성되는 것처럼 예외가 발생합니다. throw 문을 사용하는 프로그램에서는 예외가 발생합니다. 일반적으로 이러한 두 작업(객체 생성 및 예외 발생)은 하나로 결합됩니다.
throw new Exception("error…");
Java의 throw 키워드는 프로그램 런타임에 처리할 수 없는 오류나 예외 조건이 발생할 때 메서드나 코드 블록에서 예외를 발생시키는 데 사용됩니다. 프로그램 흐름은 가장 가까운 catch 블록으로 리디렉션됩니다. 이 블록은 예외를 관리할 수 있습니다.

'throw' 키워드 사용 예

Java에서 throw 키워드 의 기능을 설명하기 위해 예를 들어 보겠습니다. 숫자의 계승을 계산하는 방법을 작성해 보겠습니다. 숫자가 음수이면 계산할 수 없으므로 예외가 발생해야 합니다. 마찬가지로 숫자가 너무 크면 계승 결과가 long 유형의 최대 크기를 초과하고 또 다른 예외가 발생합니다. 여기에 메소드 구현이 있습니다.
public Class Factorial {

public static long getFactorial(final int number) {
   if ((number >= 0) && (number < 21)) {
       long fact = 1;
       for (int i = 1; i <= number; i++) {
           fact = fact * i;
       }
       return fact;
   } else {

//throw new exception here
       throw new IllegalArgumentException("THe argument isn't legal");
   }
}

 public static void main(String[] args) {
       System.out.println(getFactorial(-5));
       System.out.println(getFactorial(21));

   }
}
이 예제에서는 number 값이 음수 인 경우 throw 키워드를 사용하여 IllegalArgumentException 클래스 의 인스턴스를 발생시킵니다 . 프로그램을 실행하면 "인수가 올바르지 않습니다."라는 메시지가 콘솔에 표시됩니다. 프로그램 실행이 중단됩니다.

더 이상 오류 없음: 예외 잡기 예

이제 0으로 나누는 두 번째 예를 기억하고 예외 처리를 통해 실행해 보겠습니다.
public class DivisionExample {

    public static void main(String[] args) {
        int a = 10;
        int b = 0;
        try {
            int result = divide(a, b);
            System.out.println(result);
        } catch (ArithmeticException e) {
            System.out.println("Error: division by zero");
        }
    }

    public static int divide(int a, int b) {
        return a / b;
    }
}
이 예에서는 0으로 나누기 예외를 처리하기 위해 try-catch 구문을 추가했습니다 . 간단히 말해서 try-catch-finally는 예외 발생 여부에 관계없이 예외를 처리하고 코드를 실행할 수 있는 Java 프로그래밍 언어 구성입니다. try-catch-finally는 세 개의 블록으로 구성됩니다.
  • 시도 블록 . 잠재적으로 위험한 코드가 여기에서 실행되고 있습니다. 예외를 발생시킬 수 있는 코드입니다. try 블록 내에서 예외가 발생하면 해당 블록의 코드 실행이 중단되고 제어가 catch 블록으로 이전됩니다.
  • 캐치 블록 . 여기에서는 던져진 예외가 처리됩니다. catch 블록 에서는 catch할 예외와 catch할 때 실행할 논리를 지정할 수 있습니다.
  • 마지막 으로 블록입니다. 이는 예외 발생 여부에 관계없이 실행됩니다. 예를 들어 finally 블록 은 try 블록에 할당된 리소스(예: 파일 또는 소켓 닫기)를 해제하는 데 사용됩니다. 이 블록은 생략할 수 있습니다.
try -catch-finally 구조를 사용하면 예외적인 상황에서 프로그램 실행을 보다 정확하게 제어할 수 있으며 오류 발생 시 프로그램이 예기치 않게 종료되는 것을 방지하는 데 도움이 됩니다. 이제 우리의 예로 돌아가 보겠습니다. 나누기 메서드 중에 0으로 나누기가 발생하면 ArithmeticException 이 발생하고 catch 블록에 의해 포착됩니다. catch 블록 에서는 단순히 오류 메시지를 콘솔에 인쇄합니다. 예외가 발생하지 않으면 프로그램은 계속 실행됩니다.

키워드를 던진다

throws 키워드 메서드 서명에 사용됩니다. 그렇다면 메소드에서 예외가 발생하고 있음을 의미합니다. 이는 호출 스택 위로 예외를 전파하고 현재 메서드에서 예외를 처리할 필요가 없음을 나타낼 수 있습니다. Java에서는 "throws"를 사용하여 프로그램에 정의된 사용자 정의 예외를 참조할 수도 있습니다. 예를 들어 메소드는 두 숫자의 나눗셈을 수행하지만 두 번째 인수가 0인 경우 IllegalArgumentException을 발생시킬 수 있습니다.
public static double divide(double a, double b) throws IllegalArgumentException {
    if (b == 0) {
        throw new IllegalArgumentException("Division by zero is not allowed");
    }
    return a / b;
}
이 메서드는 throws 키워드를 사용하여 두 번째 인수가 null인 경우 IllegalArgumentException이 발생할 수 있음을 나타냅니다. 메서드를 실행하는 동안 이러한 예외가 발생하면 처리를 위해 호출 메서드로 전달됩니다. 메소드 호출 예:
public static void main(String[] args) {
    double result = 0;
    try {
        result = divide(10, 0);
    } catch (IllegalArgumentException e) {
        System.out.println("Error: " + e.getMessage());
    }
    System.out.println("Result: " + result);
}
이 예에서 Divide() 메서드는 인수 10과 0을 사용하여 호출되며, 0으로 나누는 것이 불가능하기 때문에 IllegalArgumentException 이 발생합니다. 예외는 try-catch 블록 에 의해 포착되고 오류 메시지가 표시됩니다. 예외로 인해 Divide() 메서드 의 실행이 종료되므로 프로그램의 값은 0이 됩니다 .
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다