>  기사  >  Java  >  자바 예외란 무엇입니까? Java 예외는 어떻게 처리됩니까?

자바 예외란 무엇입니까? Java 예외는 어떻게 처리됩니까?

青灯夜游
青灯夜游앞으로
2018-10-19 18:01:445229검색

이 글의 내용은 Java 예외란 무엇인지 소개하는 것입니다. Java 예외는 어떻게 처리됩니까? 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

1. JAVA 예외

예외는 파일을 찾을 수 없음, 네트워크 연결 실패, 잘못된 매개변수 등과 같은 다양한 예상치 못한 상황을 나타냅니다. 예외는 프로그램 실행 중에 발생하여 일반적인 명령 흐름을 방해하는 이벤트입니다. Java는 API에 있는 Throwable 클래스의 수많은 하위 클래스를 통해 다양한 예외를 설명합니다. 따라서 Java 예외는 코딩 부분에서 발생하는 오류 조건을 설명하는 Throwable 하위 클래스의 인스턴스인 객체입니다. 조건이 생성되면 오류가 예외를 발생시킵니다.

Java 예외 클래스 계층 다이어그램:

자바 예외란 무엇입니까? Java 예외는 어떻게 처리됩니까?

Throwable: 두 가지 중요한 하위 클래스가 있습니다: Exception(Exception) 및 Error(Error), 둘 다 Java 예외 처리 클래스의 중요한 하위 클래스입니다. 다수의 하위 클래스를 포함합니다.

오류:는 프로그램이 처리할 수 없는 오류로, 애플리케이션 실행에 심각한 문제가 있음을 나타냅니다. 대부분의 오류는 코드 작성자가 수행한 작업과 관련이 없으며 대신 코드가 실행되는 동안 JVM(Java Virtual Machine)의 문제를 나타냅니다. 예를 들어, Java 가상 머신 실행 오류(Virtual MachineError)는 JVM에 작업을 계속 실행하는 데 필요한 메모리 리소스가 더 이상 없으면 OutOfMemoryError가 발생합니다. 이러한 예외가 발생하면 JVM(Java Virtual Machine)은 일반적으로 스레드를 종료하도록 선택합니다.

예외:는 프로그램 자체에서 처리할 수 있는 예외입니다.

Java 예외(Exception 및 Error 포함)는 checked 예외(checked 예외)와 unchecked 예외(unchecked 예외)로 구분됩니다.

검사 가능한 예외(컴파일러가 처리해야 하는 예외): 올바른 프로그램이 실행될 때 발생하기 쉽고 허용할 수 있는 예외입니다. 확인 가능한 예외는 비정상적인 상황이지만 어느 정도 발생을 예상할 수 있으며, 이러한 비정상적인 상황이 발생하면 어떤 방식으로든 처리해야 합니다.

RuntimeException 및 해당 하위 클래스를 제외하고 다른 Exception 클래스 및 해당 하위 클래스는 확인 가능한 예외입니다. 이런 종류의 예외의 특징은 Java 컴파일러가 이를 확인한다는 것입니다. 즉, 프로그램에서 이러한 종류의 예외가 발생할 수 있으면 try-catch 문을 사용하여 이를 포착하거나 throws 절을 사용하여 이를 확인합니다. 선언하지 않으면 컴파일이 통과되지 않습니다.

검사할 수 없는 예외(컴파일러에서 강제 처리가 필요하지 않은 예외): 런타임 예외(RuntimeException 및 해당 하위 클래스) 및 오류(오류)가 포함됩니다.

참고: 예외는 프로그램 자체에서 처리할 수 있지만 오류는 처리할 수 없습니다.

Exception 이러한 종류의 예외는 런타임 예외와 비런타임 예외(컴파일 예외)라는 두 가지 주요 범주로 나뉩니다. 프로그램은 이러한 예외를 최대한 처리해야 합니다.

런타임 예외: 는 NullPointerException(널 포인터 예외), IndexOutOfBoundsException(아래 첨자 범위를 벗어난 예외) 등과 같은 RuntimeException 클래스 및 해당 하위 클래스의 예외입니다. 프로그램 캡처 처리 또는 처리 안함에서 선택됩니다. 이러한 예외는 일반적으로 프로그램 논리 오류로 인해 발생하므로 프로그램은 논리적 관점에서 이러한 예외가 발생하지 않도록 노력해야 합니다.

런타임 예외의 특징은 Java 컴파일러가 이를 확인하지 않는다는 것입니다. 즉, 이러한 유형의 예외가 프로그램에서 발생할 수 있으면 try-catch 문으로 포착되지 않더라도 선언되지 않습니다. throws 절을 사용하여 던져질 수도 있습니다.

런타임 예외(컴파일 예외): 는 RuntimeException 이외의 예외이며 모두 Exception 클래스와 해당 하위 클래스에 속합니다. 프로그램 구문의 관점에서 처리해야 하는 예외입니다. 처리되지 않으면 프로그램이 컴파일되지 않습니다. IOException, SQLException 등 및 사용자 정의 예외는 일반적으로 사용자 정의 확인 예외가 필요하지 않습니다.

2. 예외 처리 메커니즘

Java 애플리케이션에서 예외 처리 메커니즘은 예외를 발생시키고 예외를 잡는 것입니다.

예외 발생: 메서드에서 오류가 발생하여 예외가 발생하면 해당 메서드는 예외 객체를 생성하여 런타임 시스템에 전달합니다. 예외 객체에는 예외 유형과 같은 정보가 포함됩니다. 그리고 예외가 발생할 때의 예외 상태입니다. 런타임 시스템은 예외를 처리할 코드를 찾아 실행하는 역할을 담당합니다.

예외 잡기: 메서드가 예외를 던진 후, 런타임 시스템은 예외가 발생할 때 호출 스택에 순서대로 남아 있는 적절한 예외 처리기를 찾습니다. 예외 처리기가 처리할 수 있는 예외 유형이 메서드에서 발생한 예외 유형과 일치하는 경우 적합한 예외 처리기입니다. 런타임 시스템은 예외가 발생한 메서드부터 시작하여 적절한 예외 처리기가 포함된 메서드를 찾아서 실행할 때까지 호출 스택의 메서드를 다시 확인합니다. 런타임 시스템이 호출 스택을 탐색하고 적절한 예외 핸들러를 찾지 못하면 런타임 시스템이 종료됩니다. 동시에 자바 프로그램이 종료된다는 의미이다.

런타임 예외의 확인 불가능한 특성으로 인해, 애플리케이션을 보다 합리적이고 쉽게 구현하기 위해 Java는 런타임 예외가 Java 런타임 시스템에 의해 자동으로 발생되도록 규정하여 애플리케이션이 런타임 예외를 무시할 수 있도록 합니다.

메서드 실행 중 발생할 수 있는 오류 실행 중인 메서드가 포착되기를 원하지 않는 경우 Java에서는 해당 메서드가 Throw 문을 만들지 않도록 허용합니다. 대부분의 오류 예외는 발생해서는 안 되는 상황이자 합리적인 애플리케이션이 포착해서는 안 되는 예외이기 때문입니다.

모든 확인 가능한 예외에 대해 Java는 다음을 규정합니다. 메서드는 이를 포착하거나 던지는 메서드 외부에서 선언해야 합니다. 즉, 메소드가 확인 가능한 예외를 포착하지 않기로 선택한 경우 예외를 발생시키겠다고 선언해야 합니다.

일반적으로 Java에서는 확인 가능한 예외를 포착하거나 throw하도록 선언해야 한다고 규정합니다. 확인할 수 없는 RuntimeException 및 오류를 무시할 수 있습니다.

3. 예외 잡기: try, catch 및 finally

1.try-catch 문

자바 예외란 무엇입니까? Java 예외는 어떻게 처리됩니까?

한 쌍의 교정기 예외가 발생할 수 있는 코드 조각을 모니터링 영역이라고 합니다. Java 메소드 실행 중에 예외가 발생하면 예외 객체가 생성됩니다. 예외는 모니터링 영역 외부에서 발생하며 Java 런타임 시스템은 예외를 포착하기 위해 일치하는 catch 절을 찾으려고 합니다. 일치하는 catch 절이 있으면 해당 예외 처리 코드가 실행되고 try-catch 문이 종료됩니다. 프로그램 실행이 계속됩니다.

일치 원칙은 다음과 같습니다. 발생한 예외 개체가 catch 절의 예외 클래스에 속하거나 예외 클래스의 하위 클래스에 속하는 경우 생성된 예외 개체는 catch 블록에서 캡처한 예외 유형과 일치하는 것으로 간주됩니다.

런타임 예외를 포착하거나 선언하지 않습니다. 프로그램은 예외를 발생시키고 작업을 종료합니다.

자바 예외란 무엇입니까? Java 예외는 어떻게 처리됩니까?

일치하는 예외 유형을 포착하면 예외 처리 코드가 입력됩니다. 처리가 완료되면 전체 try-catch 문이 종료된다는 의미입니다. 다른 catch 절에는 더 이상 예외 유형을 일치시키고 catch할 기회가 없습니다. 낮은 수준의 예외 클래스를 캡처하는 catch 절을 앞쪽에 배치하고 상대적으로 높은 수준의 예외 클래스를 캡처하는 catch 절을 뒤쪽에 배치해야 합니다. 그렇지 않으면 기본 예외 클래스를 캡처하는 catch 절이 차단될 수 있습니다.

2.try-catch-finally

try-catch 문에는 finally 절인 세 번째 부분도 포함될 수 있습니다. 예외 발생 여부에 관계없이 무엇을 실행해야 하는지를 나타냅니다. try-catch-finally 문의 일반적인 구문 형식은 다음과 같습니다.

자바 예외란 무엇입니까? Java 예외는 어떻게 처리됩니까?

try 블록: 은 예외를 잡는 데 사용됩니다. 뒤에는 0개 이상의 catch 블록이 올 수 있습니다. catch 블록이 없으면 finally 블록이 와야 합니다.

catch 블록: try에 의해 잡힌 예외를 처리하는 데 사용됩니다.

finally 블록: finally 블록의 명령문은 예외가 포착되거나 처리되는지 여부에 관계없이 실행됩니다. try 블록이나 catch 블록에서 return 문이 발견되면 메서드가 반환되기 전에 finally 문 블록이 실행됩니다. 다음 4가지 특별한 상황에서는 finally 블록이 실행되지 않습니다.

1) finally 문 블록에서 예외가 발생합니다.
2) System.exit()는 이전 코드에서 프로그램을 종료하는 데 사용되었습니다.
3) 프로그램이 위치한 스레드가 종료됩니다.
4) CPU를 끕니다.

3. try-catch-finally 규칙(예외 처리 문에 대한 문법 규칙):

1) try 후에 catch를 추가하거나 finally 블록을 추가해야 합니다. try 블록 뒤에는 catch 블록과 finally 블록이 모두 올 수 있지만 적어도 하나의 블록이 있어야 합니다.

2) 블록 순서를 따라야 합니다. 코드에서 catch 블록과 finally 블록을 모두 사용하는 경우 catch 블록은 try 블록 뒤에 배치되어야 합니다.

3) catch 블록은 해당 예외 클래스의 유형과 관련이 있습니다.

4) try 블록에는 여러 개의 catch 블록이 있을 수 있습니다. 그렇다면 일치하는 첫 번째 블록이 실행됩니다. 즉, Java 가상 머신은 실제로 발생한 예외 객체를 각 catch 코드 블록에 선언된 예외 유형과 차례로 일치시킵니다. 예외 객체가 특정 예외 유형 또는 해당 하위 클래스의 인스턴스인 경우 catch 코드 블록이 실행됩니다. 다른 어떤 것도 실행되지 않습니다. catch 코드 블록

5)은 try-catch-finally 구조를 중첩할 수 있습니다.

6) try-catch-finally 구조에서는 예외가 다시 발생할 수 있습니다.
7) 다음 상황을 제외하고 finally는 항상 끝까지 실행됩니다. JVM이 조기 종료됩니다(System.exit(int) 호출). 컴퓨터 전원이 꺼지고 화재가 발생하면 처리되지 않은 예외가 발생합니다. , 또는 바이러스 공격을 받았습니다.

IV. try, catch, finally 문 블록의 실행 순서:

1) try에서 예외를 catch하지 못하는 경우: try 문 블록의 문이 하나씩 실행되고, 프로그램은 건너뜁니다. catch 문 블록은 finally 문 블록과 다음 문을 실행합니다.

2) try가 예외를 포착하면 예외는 catch 문 블록에서 처리되지 않습니다. try 문에 있는 문에서 예외가 발생하는 경우; block 및 no 이 예외의 catch 문 블록을 처리할 때 처리를 위해 예외가 JVM에 발생합니다. finally 문 블록의 문은 계속 실행되지만 finally 문 블록 뒤의 문은 실행되지 않습니다.

3) try가 예외를 catch할 때 catch 문 블록에서 이 예외를 처리해야 하는 상황이 있습니다. 특정 문이 실행될 때 try 문 블록이 순서대로 실행되면 프로그램이 다음으로 점프합니다. catch 문 블록을 하나씩 일치시키고 해당 핸들러가 발견되면 try 문 블록에서 다른 catch 문 블록이 실행되지 않습니다. 가 실행되면 finally 문 블록의 문이 실행됩니다.

try, catch 및 finally 문 블록 실행 그림:

자바 예외란 무엇입니까? Java 예외는 어떻게 처리됩니까?

5. 예외 발생

모든 Java 코드 예외가 발생할 수 있습니다(예: 직접 작성한 코드, Java 개발 환경 패키지의 코드 또는 Java 런타임 시스템). 누구나 Java의 throw 문을 통해 예외를 던질 수 있습니다. 메서드에서 발생하는 모든 예외는 throws 절을 사용해야 합니다.

1. 예외 발생

메소드가 예외를 발생시킬 수 있지만 그러한 예외를 처리할 능력이 없는 경우, 메소드 선언에서 throws 절을 사용하여 예외가 발생함을 선언할 수 있습니다.

자바 예외란 무엇입니까? Java 예외는 어떻게 처리됩니까?

메서드 이름 뒤에 나오는 Exception1,Exception2,...,ExceptionN은 던져질 예외 목록입니다. 메소드가 예외 목록에서 예외를 발생시키는 경우 해당 메소드는 이러한 유형 및 해당 서브클래스 유형의 예외를 처리하지 않지만 처리를 위해 메소드를 호출하는 메소드에 발생합니다.

예외 발생 규칙을 발생시킵니다:

1) 확인되지 않은 예외(확인되지 ​​않은 예외), 즉 Error, RuntimeException 또는 해당 하위 클래스인 경우 throws 키워드를 사용하여 선언할 필요가 없습니다. 예외 발생 예외, 컴파일은 여전히 ​​원활하게 진행될 수 있지만 런타임 시 시스템에 의해 발생됩니다.

2) 메서드가 throw할 수 있는 모든 확인된 예외를 선언해야 합니다. 즉, 메소드에 검사 가능한 예외가 있는 경우 try-catch 문을 사용하여 이를 포착하거나 throws 절을 사용하여 선언합니다. 그렇지 않으면 컴파일 오류가 발생합니다.

3) 예외가 발생하는 경우에만, 메소드 호출 예외만 처리하거나 다시 발생시켜야 합니다. 메서드 호출자가 예외를 처리할 수 없으면 계속 예외를 발생시켜야 합니다.

4) 호출 메서드는 확인 가능한 모든 예외의 처리 및 선언 규칙을 따라야 합니다. 메서드를 재정의하는 경우 재정의된 메서드와 다른 예외를 선언할 수 없습니다. 선언된 모든 예외는 재정의된 메서드에서 선언된 예외와 동일한 클래스 또는 하위 클래스에 속해야 합니다.

메서드에서 예외가 발생할 수 있는지 판단하는 기준은 다음과 같습니다.

1) 메서드에 throw 문이 있습니다.

2) 다른 메서드가 호출되고, 다른 메서드는 throws 절을 사용하여 선언되어 일종의 예외가 발생합니다.

모든 메소드가 획득한 예외를 레이어별로 처리하면 JVM은 예외 메시지와 스택 정보를 인쇄하는 것만으로 처리도 매우 간단합니다. Error 또는 RuntimeException이 발생하는 경우 메서드 호출자는 예외를 처리하도록 선택할 수 있습니다.

2.Throwable 클래스에서 일반적으로 사용되는 메서드

getCause(): 예외가 발생한 이유를 반환합니다. 원인이 존재하지 않거나 알 수 없는 경우 null이 반환됩니다.

getMeage(): 비정상적인 메시지 정보를 반환합니다.

printStackTrace(): 객체의 스택 추적은 System.err 필드의 값으로 오류 출력 스트림에 출력됩니다.

6. Java 공통 예외

Java는 자주 발생하는 오류를 설명하기 위해 몇 가지 예외를 제공합니다. 이러한 예외의 경우 일부는 프로그래머가 이를 캡처하거나 선언해야 하며 일부는 Java 가상 머신에 의해 자동으로 처리됩니다. 캡처 처리. Java의 일반적인 예외 클래스:

1.runtimeException 하위 클래스: (확인되지 ​​않은 예외)

  • java.lang.ArrayIndexOutOfBoundsException
    Array index out of ranges . 배열의 인덱스가 음수이거나 배열 크기보다 크거나 같을 때 발생합니다.

  • java.lang.ArithmeticException
    산술 조건 예외. 예: 0으로 정수 나누기 등

  • java.lang.NullPointerException
    Null 포인터 예외. 이 예외는 애플리케이션이 객체가 필요한 곳에 null을 사용하려고 시도할 때 발생합니다. 예: null 개체의 인스턴스 메서드 호출, null 개체의 속성에 액세스, null 개체의 길이 계산, throw 문을 사용하여 null 발생 등

  • java.lang.ClassNotFoundException
    Class 예외 찾을 수 없습니다. 이 예외는 애플리케이션이 문자열 형식의 클래스 이름을 기반으로 클래스를 구성하려고 시도하지만 CLASSPAH를 순회한 후 해당 이름을 가진 클래스 파일을 찾을 수 없는 경우 발생합니다.

  • java.lang.NegativeArraySizeException 배열 길이가 음수 예외

  • java.lang.ArrayStoreException 배열에 호환되지 않는 값이 포함되어 있음 ​​​​발생한 예외

  • java.lang.SecurityException 보안 예외

2.IOException(checked 예외)

IOException: 입력 스트림과 출력 스트림을 작동할 때 발생할 수 있는 예외입니다.

EOFException 파일 종료 예외

FileNotFoundException 파일을 찾을 수 없음 예외

3. 기타

ClassCastException 유형 변환 예외 클래스

ArrayStoreException 배열에 호환되지 않는 값이 포함된 경우 예외 발생 ​

SQLException 데이터베이스 작업 예외 클래스

NoSuchFieldException 필드를 찾을 수 없음 예외

NoSuchMethodException 메서드를 찾을 수 없는 예외 발생

NumberFormatException 숫자로 변환된 문자열 예외 발생

StringIndexOutOfBoundsException 문자열 인덱스가 범위를 벗어난 예외 발생

IllegalAccessException이 카테고리에 액세스하는 것이 허용되지 않음 예외

InstantiationException 애플리케이션이 다음을 시도할 때 Class 클래스의 newInstance() 메서드를 사용하여 클래스의 인스턴스를 생성하고 지정된 클래스 객체를 인스턴스화할 수 없으면 이 예외가 발생합니다.

4. 사용자 정의 예외

Java의 내장 예외 클래스를 사용하면 프로그래밍 중에 발생하는 대부분의 예외를 설명합니다. 또한 사용자는 예외를 사용자 정의할 수도 있습니다. 사용자 정의 예외 클래스는 Exception 클래스만 상속하면 됩니다.
프로그램에서 사용자 정의 예외 클래스를 사용하는 것은 대략 다음 단계로 나눌 수 있습니다.
(1) 사용자 정의 예외 클래스를 만듭니다.
(2) 메소드의 throw 키워드를 통해 예외 객체를 던집니다.
(3) 현재 예외가 발생하는 메서드에서 예외가 처리되는 경우 try-catch 문을 사용하여 이를 캡처하고 처리할 수 있습니다. 그렇지 않으면 메서드 선언에서 throws 키워드를 사용하여 예외를 표시합니다. 메서드 호출자에게 전달되고 다음 단계 작업을 계속합니다.
(4) 예외 메서드 호출자에서 예외를 포착하고 처리합니다.

요약: 위 내용이 이 글의 전체 내용입니다. 모든 분들의 공부에 도움이 되었으면 좋겠습니다. 더 많은 관련 튜토리얼을 보려면 Java 비디오 튜토리얼, Java 개발 그래픽 튜토리얼, bootstrap 비디오 튜토리얼을 방문하세요!

위 내용은 자바 예외란 무엇입니까? Java 예외는 어떻게 처리됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제