2014-12-18 1 views
0

Java 언어 디자이너가 "RuntimeException"이라는 용어를 사용한 이유는 무엇입니까? 이 나쁜 용어가 아닌가요? 모든 예외는 런타임에 IOException과 같은 확인 된 예외인지 또는 확인되지 않은 예외인지 여부와 관계없이 발생합니다.Java RuntimeException이 UncheckedException이라고하는 이유는 무엇입니까?

두 경우 모두 Throwable을 확장하는 CheckedException 및 UncheckedException을 만든 경우 더 좋지 않았습니까?

+1

예외를 지정하는 작업을 할당받은 사람이 마감 시간 전에 좋은 이름을 생각하기 위해 TIME에서 벗어나기 때문에. 아니. – ajb

+0

또 다른 관점은 역사입니다. 런타임 예외 용어는 내가 실수하지 않으면 Java보다 훨씬 앞서 있습니다. 그렇다면 자바 등장, 인수 및 예외/오류 mecanisms 확장 ... – Sebas

답변

5

확인 된 예외 (Exception 및 해당 하위 클래스)와 검사되지 않은 예외 (Error, RuntimeException 및 해당 하위 클래스)의 구분은 발생할 수있는 위치가 아니라 처리되는 위치입니다. 체크 된 예외는 이 컴파일시에을 처리해야하기 때문에 호출됩니다. 어떤 시점에서 체크 된 예외를 catch하지 않는 것은 컴파일 타임 오류입니다 *.

RuntimeExceptions는 이 아니며 컴파일시 (또는 런타임시 Java 가상 머신에서 처리되는) ​​을 처리해야하는 예외입니다. 특히 UncheckedExceptions가 아닌 이유는 Error와 RuntimeException이 적절하게 구분되어있을 수도 있고, RuntimeException이 호출하기로 선택했기 때문일 수도 있습니다.

Relevant part of the JLS.

* 기술적으로는 예외를 던지기까지 main(String[])까지 예외를 던질 수는 있지만 이는 단지 main을 호출하는 JVM의 일부가이를 catch한다는 것을 의미합니다.

+0

제가 생각하기에 최선의 대답은 그들이 OCCUR 일 때가 아니라 그들이 손에있을 때입니다. RuntimeException은 컴파일 타임에 처리 할 필요가 없으며 컴파일 된 시간에 처리 된 예외를 처리해야합니다. 아직도 런타임에서 프로그램에 의해 컴파일 타임에 처리되지 않는 RuntimeException이 실제로 프로그램에서 처리되지 않기 때문에 용어가 혼란 스럽다고 생각합니다 ... –

+0

진실로이 대답에는 새로운 것이 없습니다 ... – DJphy

0

아마 RuntimeException이라고합니다. 컴파일 단계를 확인하여이를 방지하기 때문일 수 있습니다. 을 먼저 확인하면 NullPointerException을 방지 할 수 있습니다. 다른 예외는 컴파일 단계에서 확인할 수 없습니다. 어쨌든, 그것은 단지 하나의 용어 일뿐입니다.

2

이 용어는 실제로 여기에서 문제가 아니며 이러한 오류/예외가 발생하는 구체적인 방법 및 복구 방법과 관계가 있습니다. JLS section 11.2에서

다음 체크되지 않는 예외 클래스의

는 오류 클래스가 프로그램의 많은 지점에서 발생 할 수 있기 때문에 면제하고 회복이 어렵거나 불가능합니다. 그러한 예외를 선언하는 프로그램은 무의미하게 혼란스러워 할 것입니다. 정교한 프로그램은 아직 이러한 조건들 중 일부를 포착하고 복구하려고 시도 할 수 있습니다.

확인되지 않은 예외 클래스 중 Java 프로그래밍 언어 디자이너의 판단에 따라 이러한 예외를 선언하면 프로그램의 정확성을 크게 높이 지 못하기 때문에 런타임 예외 클래스는 예외가됩니다. 자바 프로그래밍 언어의 많은 연산과 구조는 런타임에 예외를 발생시킬 수 있습니다. Java 컴파일러가 사용할 수있는 정보와 컴파일러가 수행하는 분석 수준은 일반적으로 프로그래머가 쉽게 알 수 있겠지만 그러한 런타임 예외가 발생하지 않는다는 것을 확인하기에 충분하지 않습니다. 이러한 예외 클래스를 선언하도록 요구하는 것은 프로그래머에게 짜증이 날뿐입니다.

예를 들어 특정 코드는 구조적으로 널 참조를 포함 할 수없는 순환 데이터 구조를 구현할 수 있습니다. 프로그래머는 NullPointerException이 발생할 수 없다는 것을 확신 할 수 있지만 Java 컴파일러가이를 증명하는 것은 어려울 수 있습니다. 데이터 구조의 전역 속성을 설정하는 데 필요한 정리 검증 기술은이 사양의 범위를 벗어납니다.

이것은 특정 예외가 "런타임"으로 불리는 이유와 그렇지 않은 이유에 대한 설명을 제공합니다. 프로그래머가 원치 않는 실행을 완전히 제거하거나 방지해야하는 컴파일러에서 확인 된 예외를 적용 할 수 있습니다.

+0

어쩌면하지만 의미론 측면에서, 또한 런타임에 일어난 일이 ... 맞습니까? 아니면 잡을 수있는 능력으로 인해 실제로 그 (것)들은 실제로 ... 만들어집니다. 즉, 실제로 런타임에 통과하지 못합니다. – Sebas

+0

"런타임"중에 예외가 발생한다는 사실은 구별이 이루어지는 곳이 아닙니다. 처리 방법과 관련이 있습니다. 확인 된 예외는 컴파일 타임에 코드에서 처리해야하지만 검사되지 않은 예외는 그렇지 않습니다. 언제든지 일어날 수 있습니다. 또한 전통적인 예외 처리 방법을 사용하여 정상적으로 처리되지 않습니다. 이는 실제 런타임 예외입니다. 프로그램 실행 후 오류가 발생하는 네이티브 라이브러리에 대해 생각해보십시오. 컴파일 할 때 처리 할 수 ​​없었습니다. –

+0

좋아요, 지금은 이해합니다 – Sebas

관련 문제