(i) Java의 예외 계층
Java에서 확인 된 예외와 선택되지 않은 예외의 차이점을 이해하려면 먼저 Java의 예외 계층을 살펴 보겠습니다.
이것은 단순화 된 Java 예외 계층 다이어그램입니다. 모든 클래스는 Throwable에서 상속되며 다음 층은 오류 및 예외의 두 구조로 나뉩니다. 오류 클래스 수준은 Java 런타임 시스템의 내부 오류 및 리소스 소진 오류를 설명합니다. 단순히이 오류를 사용자에게보고하고 프로그램이 안전하게 종료되는 것을 방지하려고 시도하는 것 외에도 일반적으로 다른 솔루션이 있습니다.
(ii) 검사되지 않은 예외와 점검 된 예외의 차이
위의 것을 이해 한 후 확인 된 예외와 선택되지 않은 예외가 무엇인지 살펴 보겠습니다. 실제로 Java 언어 사양은이 두 가지를 매우 간단하게 정의합니다. 오류 또는 runtimeexception에서 파생 된 예외를 확인되지 않은 예외라고하며 다른 모든 예외는 점검 된 예외가됩니다 . 이 정의는 매우 간단하지만 runtimeexception은 매우 혼란스러운 개념입니다. 우리의 모든 예외는 프로그램을 실행하는 과정에있는 것 같습니다. 효과적인 Java에서 Ru ntimeexception에 대한 나의 설명은 그렇게 만족스럽지 않습니다.
복구 가능한 조건 및 프로그래밍 오류에 대한 런타임 예외에 대한 검사 예외 사용 (2 판의 항목 58)
그러나이 문장에서 우리는 단순히 확장 할 수 있습니다 . 예를 들어, 배열 첨자는 한계가 벗어나고 널 포인터 예외 등에 액세스합니다. 약간의주의를 기울이는 한 이러한 예외는 인코딩 단계에서 피할 수있는 예외입니다. 이 두 개념을 구별하기가 어렵다고 생각한다면 "가장 폭력적인"방법은 일반적인 runtimeexception을 암기하는 것입니다.
(iii) 왜 검사되지 않은 예외와 점검 된 예외를 구별해야합니까?
그 이유는 실제로 매우 간단합니다. 컴파일러는 확인 된 모든 예외에 대한 예외 처리 메커니즘을 제공하는지 확인합니다. 예를 들어, class.forname ()을 사용하여 주어진 문자열의 클래스 객체를 찾을 때,이 메소드에 예외 처리가 제공되지 않으면 컴파일이 전달되지 않습니다.
(iv) 우리는 어떤 예외를 선언해야합니까?
앞에서 말했듯이 Runtimeexception은 프로그래밍 프로세스 중에 피할 수있는 오류입니다. 그래서 우리는 이러한 예외를 던질 필요가 없습니까? 원칙적으로 이것은 사실이지만 Java 사양은 이것을 제한하지 않습니다. 그것은 당신이 한계에서 배열을 던지는 것처럼 보이며 실질적인 의미는 없으며 반대로 특정 성능 손실을 유발할 것입니다. 그렇다면 어떻게 우리는 던지기 예외를 설계해야합니까? 우리는 던지기 예외를 선언하기 위해 다음 두 가지 상황이 필요하다는 것을 기억해야합니다.
IOException과 같은 점검 된 예외 방법을 호출하십시오. 그 이유에 관해서는, 우리는 앞에서 논의한 결과, 모든 확인 된 예외가 발생하면 편집 할 수 없습니다. 프로그램 실행 중에 오류가 발견되었으며 Throw 문을 사용하여 예외가 발생했습니다. 확인되지 않은 예외의 경우 피할 수있는 (런타임 예외) 또는 통제 할 수없는 두 가지 주요 상황 만 있습니다. 이것들은 또한 예외 선언이 필요합니다.
다음은 위의 주 2에 언급 된 어색한 것들을 설명하기위한 예입니다.
먼저, 예외에서 상속 된 기본 예외 클래스 genericexception을 정의하십시오.
패키지 check_unchecked_exceptions; public class genericexception 확장 예외 { / ** * / private static final long serialversionuid = 2778045265121433720L; publicericexception () {} publicericexception (String msg) {super (msg); }} 다음은 테스트 클래스 verifyException을 정의합니다.
패키지 check_unchecked_exceptions; public class verifyException {public void first ()는 genericexception {throw new genericexception ( "확인 된 예외"); } public void Second (String Msg) {if (msg == null) {새 nullpointerexception ( "확인되지 않은 예외"); }} public void Third ()는 genericexception {first (); } public static void main (String [] args) {verifyException ve = new verifyException (); {ve.first (); } catch (genericexception e) {e.printstacktrace (); } ve.second (null); }}실행 후 Eclipse 콘솔에서 다음 정보를 얻으십시오.
check_unchecked_exceptions.genericexception : 점검 예외
at Check_unchecked_exceptions.VerifyException.First (verifyException.java:6)
at Check_unchecked_exceptions.VerifyException.Main (verifyException.java:23)
스레드의 예외 "main"java.lang.nullpointerexception : 확인되지 않은 예외
at Check_unchecked_exceptions.VerifyException.second (verifyException.java:11)
at Check_unchecked_exceptions.VerifyException.Main (verifyException.java:29)
위의 예에서 확인 및 확인되지 않은 개념과 결합하여 부모 클래스 예외는 점검 유형이지만 서브 클래스 runtimeexception (서브 클래스 NullPointerException)은 확인되지 않았습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.