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

자바의 예외

무작위의 그룹에 게시되었습니다
회원
안녕하세요! 오늘 수업에서는 Java 예외에 대해 이야기하겠습니다. 일상은 우리가 예상하지 못한 상황으로 가득 차 있습니다. 예를 들어, 아침에 일어나서 휴대폰 충전기를 찾아보지만 어디에서도 찾을 수 없습니다. 당신은 샤워를 하러 화장실에 갔지만 파이프가 얼어붙은 것을 발견했습니다. 차에 타지만 시동이 걸리지 않습니다. 인간은 그러한 예측할 수 없는 상황에 아주 쉽게 대처할 수 있습니다. 이 기사에서는 Java 프로그램이 이를 처리하는 방법을 알아내려고 합니다.

Java 예외란 무엇입니까?

프로그래밍 세계에서는 프로그램 실행 중 오류 및 예기치 않은 상황을 예외라고 합니다. 프로그램에서 잘못된 사용자 작업, 디스크 공간 부족 또는 서버와의 네트워크 연결 손실로 인해 예외가 발생할 수 있습니다. 프로그래밍 오류나 API의 잘못된 사용으로 인해 예외가 발생할 수도 있습니다. 실제 세계의 인간과 달리 프로그램은 이러한 상황을 처리하는 방법을 정확히 알아야 합니다. 이를 위해 Java에는 예외 처리라는 메커니즘이 있습니다.

키워드에 대한 몇 마디

Java의 예외 처리는 프로그램에서 다음 키워드의 사용을 기반으로 합니다.
  • try - 예외가 발생할 수 있는 코드 블록을 정의합니다.
  • catch - 예외가 처리되는 코드 블록을 정의합니다.
  • finally - try 블록의 결과에 관계없이 실행되는 선택적 코드 블록을 정의합니다.
이러한 키워드는 코드에서 특수 구문을 생성하는 데 사용됩니다: try{}catch , try{}catch{}finally , try{}finally{} .
  • throw - 예외를 발생시키는 데 사용됩니다.
  • throws - 메서드 서명에서 메서드가 예외를 throw할 수 있음을 경고하는 데 사용됩니다.
Java 프로그램에서 키워드를 사용하는 예:
// This method reads a string from the keyboard

public String input() throws MyException { // Use throws to warn
// that the method may throw a MyException
      BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    String s = null;
// We use a try block to wrap code that might create an exception. In this case,
// the compiler tells us that the readLine() method in the
// BufferedReader class might throw an I/O exception
    try {
        s = reader.readLine();
// We use a catch block to wrap the code that handles an IOException
    } catch (IOException e) {
        System.out.println(e.getMessage());
// We close the read stream in the finally block
    } finally {
// An exception might occur when we close the stream if, for example, the stream was not open, so we wrap the code in a try block
        try {
            reader.close();
// Handle exceptions when closing the read stream
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    if (s.equals("")) {
// We've decided that an empty string will prevent our program from working properly. For example, we use the result of this method to call the substring(1, 2) method. Accordingly, we have to interrupt the program by using throw to generate our own MyException exception type.
        throw new MyException("The string cannot be empty!");
    }
    return s;
}

예외가 필요한 이유는 무엇입니까?

실제 세계의 예를 살펴보겠습니다. 고속도로 구간에 무게 용량이 제한된 작은 다리가 있다고 상상해 보십시오. 다리의 한계보다 무거운 차가 지나가면 다리가 무너질 수 있습니다. 운전자의 상황은 가볍게 말하면 예외가 될 것입니다. 이를 방지하기 위해 교통부는 문제가 발생하기 전에 도로에 경고 표지판을 설치합니다. 운전자는 경고 표지판을 보고 차량의 무게와 다리의 최대 무게를 비교합니다. 차량이 너무 무거우면 운전자는 우회 경로를 이용합니다. 교통부는 첫째, 트럭 운전자가 필요한 경우 경로를 변경할 수 있도록 했고, 둘째, 운전자에게 주요 도로의 위험에 대해 경고했으며, 셋째, 운전자에게 특정 조건에서 다리를 사용해서는 안 된다고 경고했습니다. Java의 예외 - 2프로그램에서 예외 상황을 방지하고 해결하여 프로그램이 계속 실행되도록 하는 기능은 Java에서 예외를 사용하는 이유 중 하나입니다. 예외 메커니즘을 사용하면 모든 입력의 유효성을 검사(확인)하여 코드(API)를 부적절한 사용으로부터 보호할 수 있습니다. 이제 여러분이 잠시 운송 부서라고 상상해 보십시오. 첫째, 운전자가 문제를 예상할 수 있는 장소를 알아야 합니다. 둘째, 경고 표지판을 만들고 설치해야 합니다. 마지막으로 주요 경로에서 문제가 발생하면 우회로를 제공해야 합니다. Java에서 예외 메커니즘은 유사한 방식으로 작동합니다. 개발 중에 우리는 try 블록을 사용하여 코드의 위험한 부분 주위에 "예외 장벽"을 구축하고 catch {} 를 사용하여 "백업 경로"를 제공합니다.그리고 finally{} 블록 에서 무엇이든 실행되어야 하는 코드를 작성합니다 . "백업 경로"를 제공할 수 없거나 사용자에게 선택할 수 있는 권한을 제공하려는 경우 최소한 위험에 대해 경고해야 합니다. 왜? 단 하나의 경고 표시도 보지 못한 채 건널 수 없는 작은 다리에 도달한 운전자의 분노를 상상해 보십시오! 프로그래밍에서 클래스와 메서드를 작성할 때 다른 개발자가 어떻게 사용할지 항상 예측할 수는 없습니다. 결과적으로 예외적인 상황을 해결하는 100% 올바른 방법을 예측할 수 없습니다. 즉, 예외적인 상황의 가능성에 대해 다른 사람에게 경고하는 것이 좋은 형식입니다. Java의 예외 메커니즘을 사용하면 throws를 사용하여 이를 수행할 수 있습니다.키워드 — 본질적으로 메서드의 일반 동작에 예외 발생이 포함된다는 선언입니다. 따라서 이 메서드를 사용하는 사람은 누구나 예외를 처리하는 코드를 작성해야 한다는 것을 알고 있습니다.

"문제"에 대해 다른 사람에게 경고

메서드에서 예외를 처리할 계획이 없지만 예외가 발생할 수 있음을 다른 사람에게 경고하려면 throws 키워드를 사용하세요. 메서드 시그니처의 이 키워드는 특정 조건에서 메서드가 예외를 throw할 수 있음을 의미합니다. 이 경고는 메서드 인터페이스의 일부이며 사용자가 자신의 예외 처리 논리를 구현할 수 있도록 합니다. 던지기 후에 던진 예외 유형을 지정합니다. 이들은 일반적으로 Java의 Exception 클래스에서 파생됩니다. Java는 객체 지향 언어이므로 모든 예외는 Java의 객체입니다. Java의 예외 - 3

예외 계층

프로그램이 실행되는 동안 오류가 발생하면 JVM은 Java 예외 계층(공통 조상인 Throwable 클래스에서 파생될 수 있는 예외 집합)에서 적절한 유형의 객체를 생성합니다 . 예외적인 런타임 상황을 두 그룹으로 나눌 수 있습니다.
  1. 프로그램이 복구할 수 없고 정상적인 작동을 계속할 수 없는 상황.
  2. 회복이 가능한 상황.
첫 번째 그룹에는 Error 클래스 에서 파생된 예외와 관련된 상황이 포함됩니다 . JVM 오작동, 메모리 오버플로 또는 시스템 장애로 인해 발생하는 오류입니다. 일반적으로 소프트웨어로 해결할 수 없는 심각한 문제를 나타냅니다. Java에서는 이러한 예외의 가능성이 컴파일러에 의해 확인되지 않으므로 확인되지 않은 예외라고 합니다. 이 그룹에는 Exception 에서 파생되는 예외인 RuntimeExceptions도 포함됩니다.클래스이며 런타임에 JVM에 의해 생성됩니다. 프로그래밍 오류로 인해 발생하는 경우가 많습니다. 이러한 예외는 컴파일 시간에 선택되지 않으므로(선택되지 않음) 이를 처리하기 위해 코드를 작성할 필요가 없습니다. 두 번째 그룹에는 프로그램을 작성할 때 예측할 수 있는 예외적인 상황이 포함됩니다(따라서 이를 처리하는 코드를 작성해야 함). 이러한 예외를 확인된 예외라고 합니다. 예외와 관련하여 대부분의 Java 개발자 작업은 이러한 상황을 처리하는 것입니다.

예외 만들기

프로그램이 실행될 때 예외는 JVM에 의해 또는 수동으로 throw 문을 사용하여 생성됩니다. 이 경우 예외 객체가 메모리에 생성되고 프로그램의 기본 흐름이 중단되며 JVM의 예외 처리기가 예외 처리를 시도합니다.

예외 처리

Java에서는 try{}catch , try{}catch{}finallytry{}finally{} 구조를 사용하여 예외 처리의 필요성을 예상하는 코드 블록을 생성합니다. tryJava의 예외 - 4 블록 에서 예외가 발생하면 JVM은 다음 catch 블록 에서 적절한 예외 핸들러를 찾습니다 . catch 블록에 필요한 예외 처리기가 있는 경우 제어가 전달됩니다. 그렇지 않은 경우 JVM은 적절한 핸들러를 찾을 때까지 catch 블록 체인을 더 자세히 찾습니다 . catch 블록을 실행한 후 제어는 선택적 finally 블록 으로 전송됩니다 . 적당한 캐치 라면블록이 없으면 JVM은 프로그램을 중지하고 finally 블록이 있는 경우 먼저 수행한 후 스택 추적 (메소드 호출의 현재 스택)을 표시합니다. 예외 처리의 예:
public class Print {

     void print(String s) {
        if (s == null) {
            throw new NullPointerException("Exception: s is null!");
        }
        System.out.println("Inside print method: " + s);
    }

    public static void main(String[] args) {
        Print print = new Print();
        List list= Arrays.asList("first step", null, "second step");

        for (String s : list) {
            try {
                print.print(s);
            }
            catch (NullPointerException e) {
                System.out.println(e.getMessage());
                System.out.println("Exception handled. The program will continue");
            }
            finally {
                System.out.println("Inside finally block");
            }
            System.out.println("The program is running...");
            System.out.println("-----------------");
        }

    }
    }
주요 방법 의 결과는 다음과 같습니다 .
Inside print method: first step
Inside finally block
The program is running...
-----------------
Exception: s is null!
Exception handled. The program will continue
Inside finally block
The program is running...
-----------------
Inside print method: second step
Inside finally block
The program is running...
-----------------
finally 는 일반적으로 모든 스트림을 닫고 try 블록에서 열려 있거나 할당된 모든 리소스를 해제하는 데 사용됩니다. 그러나 프로그램을 작성할 때 모든 리소스의 클로저를 추적하는 것이 항상 가능한 것은 아닙니다. 우리의 삶을 더 쉽게 만들기 위해 Java 개발자는 try-with-resources 구성을 제공하여 try 블록 에서 열린 모든 리소스를 자동으로 닫습니다 . 첫 번째 예제는 try-with-resources 로 다시 작성할 수 있습니다 .
public String input() throws MyException {
    String s = null;
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))){
        s = reader.readLine();
   } catch (IOException e) {
       System.out.println(e.getMessage());
   }
    if (s.equals("")) {
        throw new MyException ("The string cannot be empty!");
    }
    return s;
}
버전 7에 도입된 Java 기능 덕분에 이기종 예외 포착을 하나의 블록으로 결합하여 코드를 더 간결하고 읽기 쉽게 만들 수 있습니다. 예:
public String input() {
    String s = null;
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
        s = reader.readLine();
        if (s.equals("")) {
            throw new MyException("The string cannot be empty!");
        }
    } catch (IOException | MyException e) {
        System.out.println(e.getMessage());
    }
    return s;
}

결론

Java에서 예외를 사용하면 "백업 경로"를 생성하고 catch 블록을 사용하여 예외 처리 코드에서 기본 코드를 분리하고 예외 처리에 대한 책임을 메서드를 사용하는 사람에게 전가하기 위해 throw를 사용하여 프로그램을 더욱 강력하게 만들 수 있습니다 .
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다