예외와 오류의 차이점


173

기본 Java 및 다양한 유형의 Throwable에 대해 자세히 배우려고하는데 예외와 오류의 차이점을 누군가에게 알려 줄 수 있습니까?

답변:


178

오류를 포착하거나 처리해서는 안됩니다 (가장 드문 경우 제외). 예외 처리의 빵과 버터는 예외입니다. 자바 독은 잘 설명 :

Error는 합리적인 응용 프로그램이 포착하려고하지 않아야하는 심각한 문제를 나타내는 Throwable의 하위 클래스입니다. 이러한 오류는 대부분 비정상적인 상태입니다.

ErrorJavaDoc 주석 중 일부를 사용하여 의 서브 클래스를 살펴보십시오 .

  • AnnotationFormatError -주석 파서가 클래스 파일에서 주석을 읽으려고 시도하고 주석이 잘못되었다고 판단 할 때 발생합니다.
  • AssertionError -어설 션이 실패했음을 나타냅니다.
  • LinkageError-LinkageError의 서브 클래스는 클래스가 다른 클래스에 대한 종속성을 가지고 있음을 나타냅니다. 그러나 후자의 클래스는 이전 클래스의 컴파일 후 호환되지 않게 변경되었습니다.
  • VirtualMachineError -Java Virtual Machine이 손상되었거나 계속 작동하는 데 필요한 자원이 부족함을 나타냅니다.

다음과 같은 세 가지 중요한 하위 범주가 있습니다 Throwable.

  • Error -충분히 심각한 문제가 발생하여 대부분의 응용 프로그램이 문제를 처리하려고하기보다는 충돌해야합니다.
  • 검사되지 않은 예외 (일명 RuntimeException)-매우 자주 NullPointerException또는 잘못된 인수 와 같은 프로그래밍 오류 . 응용 프로그램은 때때로이 Throwable범주를 처리하거나 복구 할 수 있습니다. 또는 최소한 Thread의 run()메서드 에서이를 파악 하여 불만 사항을 기록한 후 계속 실행할 수 있습니다.
  • 검사 예외는 (다른 모든 일명) - 응용 프로그램은 같은 캐치 의미 나머지 뭔가를 할 수있을 것으로 예상된다 FileNotFoundExceptionTimeoutException...

10
오라클은 말합니다 Unchecked exceptions != RuntimeExceptions. Unchecked exceptions = RuntimeExceptions + Errors. 나는 그것이 질문을 제기한다는 것을 알고 있습니다 : 오류는 예외입니까? 그러나 이것이 그들이 쓰는 것입니다. docs.oracle.com/javase/tutorial/essential/exceptions/… 중 하나입니다 .
ROMANIA_engineer

1
대답하지 않은 질문은 RuntimeException과 Error가 본질적으로 어떻게 다른가요? 둘 다 다른 방법으로 확인되지 않고 동일합니다.
Pacerier

38

@ georgios-gousios 의 Java 예외 계층 구조보여주는슬라이드는 Java의 오류와 예외의 차이점을 간결하게 설명합니다.

자바 예외 계층


6
누군가 NullPointerException에서 회복하는 것을보고 싶습니다 : D : D : D
Ignacio Soler Garcia

2
@IgnacioSolerGarcia 그것은 가능하고 심지어 의미가 있습니다 (다른 질문은 그것이 좋다면). 일반적으로 객체가 존재하는지 확인한 후 해당 메소드를 호출하거나 필드를 사용합니다. 그러나 존재를 확인하는 대신 NPE를 잡아보십시오. 예를 들어, 그것에 관한 메시지를 기록하고 계속하십시오.
Gangnus

@ 강 너스 : 말이되지 않습니다. 예외는 코드의 일부를 건너 뛰고 정상적인 작업이 아니라 오류를보고하는 방법이라는 것을 기억하십시오.
Ignacio Soler Garcia

17

오류는 알고있는 것처럼 응용 프로그램의 끝을 알리는 경향이 있습니다. 일반적으로 복구 할 수 없으며 VM을 종료해야합니다. 종료하기 전에 로그 나 표시 및 적절한 메시지를 제외하고는이를 캐치하지 마십시오.

예 : OutOfMemoryError- 프로그램을 더 이상 실행할 수 없기 때문에 할 수있는 일이 많지 않습니다.

예외는 종종 복구 가능하며, 그렇지 않은 경우에도 일반적으로 시도 된 작업이 실패했음을 의미하지만 프로그램은 계속 수행 할 수 있습니다.

예 : IllegalArgumentException- 유효하지 않은 데이터를 메소드에 전달하여 메소드 호출에 실패했지만 이후 작업에는 영향을 미치지 않습니다.

이들은 단순한 예이며 예외 만에 대한 또 다른 풍부한 정보가 있습니다.


examples.javacodegeeks.com/java-basics/exceptions/... 예를 들어. IllegalArgumentException은 런타임 예외이며 오류가 아닙니다. docs.oracle.com/javase/7/docs/api/java/lang/…
Gangnus

8

오류 -

  1. Errorjava의 s 유형 java.lang.Error입니다.
  2. Java의 모든 오류는 검사되지 않은 유형입니다.
  3. Error런타임에 발생합니다. 그들은 컴파일러에게 알려지지 않을 것입니다.
  4. 오류를 복구하는 것은 불가능합니다.
  5. Error주로 응용 프로그램이 실행되는 환경에서 발생합니다.
  6. 예 : java.lang.StackOverflowError ,java.lang.OutOfMemoryError

예외 -

  1. Exceptionjava의 s 유형 java.lang.Exception입니다.
  2. Exceptions는 검사 유형과 선택되지 않은 유형을 모두 포함합니다.
  3. 검사 된 예외는 런타임에 발생하기 때문에 검사되지 않은 예외는 컴파일러에 알려지지 않은 것으로 컴파일러에 알려져 있습니다.
  4. try-catch블록을 통해 예외를 처리하여 예외를 복구 할 수 있습니다 .
  5. Exception주로 응용 프로그램 자체에 의해 발생합니다.
  6. 예 : 검사 예외 : SQLException, IOException
    체크되지 않는 예외 : ArrayIndexOutOfBoundException, ClassCastException,NullPointerException

더 읽을 거리 : http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/ http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png



3

Error수업에 대한 설명 은 매우 분명합니다.

Error하위 클래스 Throwable 는 합리적인 응용 프로그램이 포착하려고 시도해서는 안되는 심각한 문제를 나타냅니다. 이러한 오류는 대부분 비정상적인 상태입니다. ThreadDeath 에러는 「정상」인 상태입니다 만, 또한의 하위 클래스 Error대부분의 어플리케이션에서는 캐치해서는 안되기 때문이다.

메소드는 throws 절 Error에서 메소드 실행 중에 발생하지만 포착되지 않는 서브 클래스를 선언 할 필요는 없습니다. 이러한 오류는 절대 발생하지 않아야하는 비정상적인 조건이기 때문입니다.

클래스Error 자체 에 대한 Java 자체 문서 에서 인용했습니다 .

간단히 말해서, Error타당한 이유가 없다면 s를 잡아서는 안됩니다 . (예를 들어 서블릿에 메모리가 부족한 경우 웹 서버 구현이 중단되는 것을 방지하기 위해)

Exception, 다른 한편으로는, 다른 현대적인 언어처럼 정상적인 예외입니다. Java API 문서 또는 온라인 또는 오프라인 자원에 자세한 설명이 있습니다.


2

몇 가지 유사점과 클래스의 차이가있다 java.lang.Exceptionjava.lang.Error.

유사점 :

  • 첫 번째 - 두 클래스를 확장 java.lang.Throwable하고 다음과 같은 오류를 처리 할 때 공통적 인 방법의 많은 결과로 상속이 사용되는 : getMessage, getStackTrace, printStackTrace등.

  • 둘째, 하위 클래스이므로 java.lang.Throwable다음과 같은 속성을 상속합니다.

    • Throwable 자체 및 하위 클래스 (포함 java.lang.Error)는 throws키워드를 사용하여 메소드 예외 목록에서 선언 할 수 있습니다 . 이러한 선언은 필요 java.lang.Exception와 서브 클래스를 위해 java.lang.Throwable, java.lang.Error그리고 java.lang.RuntimeException자신의 서브 클래스는 선택 사항입니다.

    • java.lang.Throwable에서 하위 클래스 만 사용할 수 있습니다 catch.

    • java.lang.Throwable하위 클래스 만 키워드-와 함께 사용할 수 있습니다 throw.

이 속성의 결론은 두 가지 모두 java.lang.Errorjava.lang.Exception따르며 메서드 헤더에 선언 할 수 있으며 catch절에있을 수 있으며 keyword와 함께 사용할 수 있습니다 throw.

차이점 :

  • 첫 번째-개념상의 차이 : java.lang.ErrorJVM에서 발생하도록 설계되었으며 심각한 문제를 나타내며 잡히지 않고 프로그램 실행을 중지하려고합니다 (그러나 다른 java.lang.Throwable후속 작업 에서도 가능합니다 ).

    에 대한 javadoc 설명 의 구절 java.lang.Error:

    ... 적당한 응용 프로그램이 포착하려고 시도해서는 안되는 심각한 문제를 나타냅니다.

    반대로 java.lang.Exception, 프로그램 실행을 종료하지 않고 프로그래머가 예상하고 처리 할 수있는 오류를 나타내도록 설계되었습니다.

    에 대한 javadoc 설명 의 구절 java.lang.Exception:

    ... 적합한 응용 프로그램이 잡을 수있는 조건을 나타냅니다.

  • 초 사이의 차이 java.lang.Errorjava.lang.Exception그는 먼저 간주 체크 컴파일 시간 예외 검사 용 예외. 결과 코드가 throw java.lang.Error되거나 해당 하위 클래스가이 오류를 메서드 헤더에 선언 할 필요가 없습니다. java.lang.Exception메소드 헤더에 필요한 선언을 던지는 동안

Throwable 및 후속 클래스 다이어그램 (속성 및 메소드는 생략 됨). 여기에 이미지 설명을 입력하십시오


1

IMO 오류는 응용 프로그램이 실패하여 처리해서는 안되는 문제입니다. 예외는 예기치 않은 결과를 초래할 수 있지만 복구 할 수있는 것입니다.

예:

프로그램에 메모리가 부족한 경우 응용 프로그램을 계속할 수 없으므로 오류입니다. 그러나 프로그램이 잘못된 입력 유형을 허용하는 경우 프로그램이 처리하고 올바른 입력 유형을 수신하도록 경로 재 지정할 수 있으므로 예외입니다.


1

오류는 주로 응용 프로그램이 실행되는 환경에서 발생합니다. 예를 들어, OutOfMemoryError는 JVM에 메모리가 부족할 때 발생하거나 StackOverflowError는 스택이 오버 플로우 될 때 발생합니다.

예외는 주로 응용 프로그램 자체에 의해 발생합니다. 예를 들어 NullPointerException은 응용 프로그램이 null 개체에 액세스하려고 할 때 발생하거나 응용 프로그램이 호환되지 않는 클래스 유형을 캐스팅하려고 할 때 발생합니다.

출처 : Java의 오류 대 예외의 차이점


"오류는 주로 응용 프로그램이 실행되는 환경에 의해 발생합니다"및 "예외는 주로 응용 프로그램 자체에 의해 발생합니다"!
ADJ

0

다음은 오류 및 예외가 나타내는 Java API의 요약입니다.

Error는 합리적인 응용 프로그램이 포착하려고하지 않아야하는 심각한 문제를 나타내는 Throwable의 하위 클래스입니다. 이러한 오류는 대부분 비정상적인 상태입니다. "정상"조건이지만 ThreadDeath 오류는 대부분의 응용 프로그램이이를 포착하려고 시도하지 않기 때문에 Error의 하위 클래스이기도합니다.

메소드는 throws 절에서 메소드 실행 중에 발생하지만 포착되지 않는 Error의 서브 클래스를 선언 할 필요는 없습니다. 이러한 오류는 절대 발생하지 않아야하는 비정상적인 조건이기 때문입니다.

OTOH, 예외의 경우 Java API는 다음과 같이 말합니다.

Exception 클래스와 그 서브 클래스는 합리적인 응용 프로그램이 잡을 수있는 조건을 나타내는 Throwable 형식입니다.


0

응용 프로그램이나 프로그램이 실행되는 환경에서 오류가 발생합니다. 대부분의 경우 응용 프로그램이나 프로그램이 종료되므로 복구 할 수 없습니다. Javadoc은 그러한 오류에 대한 JVM과 같은 환경이 어쨌든 종료되기 때문에 그러한 오류를 잡는 것을 귀찮게하지 말라고 권고했습니다.

예 : VirtualMachineError-JVM (Java Virtual Machine)이 손상되었거나 계속 작동하는 데 필요한 자원이 부족함을 나타냅니다. OutOfMemoryErrorJVM에 메모리 StackOverflowError가 부족하거나 스택이 초과 될 때 발생합니다.

응용 프로그램이나 프로그램 자체에 의해 예외가 발생합니다. 아마도 당신의 실수 때문일 것입니다. 대부분의 경우 복구 할 수 있으며 응용 프로그램은 계속 실행됩니다. 이러한 오류를 포착하여 응용 프로그램이나 프로그램의 비정상 종료를 방지하고 예외 메시지를 사용자 정의하여 사용자가 모든 곳에 흩어져있는 기본 못생긴 예외 메시지 대신 멋진 형식의 메시지를 볼 수 있도록하는 것이 좋습니다.

예 : NullPointerException응용 프로그램이 null 개체에 액세스하려고 할 때 발생합니다. 또는 존재하지 않는 인덱스로 배열에 액세스하려고하거나 잘못된 데이터 또는 매개 변수로 함수를 호출하려고합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.