2010-05-21 5 views
9

NullPointerException이 런타임 예외이기 때문에 모든 메서드에서이를 throw 할 수 있으므로 모든 메서드에서 "throw NullPointerException"이 필요하고 추한 것입니다. 그러나 이것은 RemoteException과 함께 발생합니다.NullPointerException이 런타임 예외이고 RemoteException이 아닌 이유는 무엇입니까?

RemoteException이 런타임 예외가 아니기 때문에 가능한 이유는 예외를 처리하도록 클라이언트에 알리는 것입니다. 그러나 원격 환경에서 모든 메소드가이를 필요로하므로 NullPointerException을 발생시키는 차이점이 없습니다.

추측? 내가 분명 했니?

+1

명도 체크 된 예외의 개념이없는 언어에서 할 어떻게? 당신이 할 수있는 일은 다른 언어로 깨끗하게 할 수 없습니까? 문제는 실패가 정상적인 것을 깨닫지 않고 특별한 경우 인 "실패"를 고려하는 사람들입니다. 이러한 종류의 사람들은 예외를 확인하는 거대한 GOTO 문과 같습니다. 국가 시험 방법? 시간 초과? Naaaaah. 큰 거인 GOTOs * "sh! t가 팬에 부딪쳤다"*. 꽤 많은 Java 사양을 가지고 있으며, 전체 자바 커뮤니티를 재구성하지는 않습니다 (예 : Spring 프레임 워크는 큰 증오감을 가지고 있습니다). – SyntaxT3rr0r

+5

Webinator, 그 남자가 아주 합리적인 질문을했습니다. 호언 장담 할 필요가 없습니다. – DJClayworth

답변

17

나는 Java WMI의 설계 및 구현을 이끌어가는 Ann Wollrath의 결정에 대한 설명을 인용하겠다. 이것은 (1999 월에서 메시지)를 RMI-USERS 아카이브에서이 message에서 추출한 :

RemoteException을가 가에 예외를 나열하는 원격 방법을 필요로하는 예외를 확인하게하는 결정의 던졌습니다 절은 아니다 종교적인 것. 결정은 분산 컴퓨팅을 신뢰할 수있게 만드는 방법을 기반으로합니다. 이 질문은 사용자 목록에있는 동안 번에 한 번씩 나타납니다. 이전에 이라고 게시 한 자세한 응답이 있습니다. 여기에 관심이 있다면 입니다. rmi-users 보관함에서 찾을 수 없으므로 아래에 을 포함 시켰습니다.

환호,

- 앤


는 차라리 의 RuntimeException보다, RemoteException을 체크 예외 만들기 에 대한 이론적 근거를 해결하고 싶습니다.

1) 네트워크는

나는 그들이 있다고 좋겠지 만, 사실, 들이 아니에요 신뢰할 수 없습니다. 모든 네트워크에는 일시적인 오류가 있습니다. 네트워크 리던던시를 구축 할 수 있지만 사실 대부분의 네트워크에는없는 입니다. 인터넷에는 과 같은 일시적인 오류가 있습니다. 따라서 모든 RPC는 이 실패 할 수 있습니다. 유형의 실패는 "네트워크"자체와 함께 을 수행 할 수 없습니다. 서버에 파일 설명자가 없으면 클라이언트에 예외가 발생합니다. 이것은 네트워크가 아닙니다 네트워크의 의미에서, 이 고장났습니다; 귀하의 서버는 자원의 일시적인 상태 인 에 있습니다.

RMI는 단일 시스템이 충돌 할 때 전체 네트워크 이 충돌하는 제한된 경우 만 처리하도록 설계되지 않았습니다. 그런 네트워크는 으로 신뢰할 수 있습니다. 모든 것이 올라 갔거나 모든 것이 다운되었습니다. 부분 오류가 없습니다. RMI는 좀 더 일반적인 잠재 고객 인 에 타겟팅됩니다.

실패 클라이언트에서 숨길 수 없습니다 2) RPC

부분 실패 의 사실 분산 프로그래밍입니다; 이 오류는 프로그램에 숨길 수 없습니다. 예외가 에 검사되었거나 검사되지 않은 예외인지 여부에 관계없이 클라이언트에 오류가 표시됩니다. 이 여전히 표시됩니다. 그렇다면 클라이언트에게 어떻게 그러한 오류 메시지를 표시해야합니까?

3) 예외가 더 강력한 프로그램 오크와 자바의 초기 버전 예외를 확인하지 않은 시간이 있었다

을 육성 확인. 예외 처리 이 권고 였고 거기에는 안전하지 않은 세계가있었습니다. 우리 그룹 (짐 Waldo와 나 : 특히) 는 컴파일러에 의해 검사 된 예외가있을 것을 권한다. 짐은 강력한 코드가 인 세계의 에게 말하면서 그의 주장에 설득력있는 꽤 이었다. 몇 가지 고려 사항을 수행 한 후에 Java 을 다시 검사하여 예외를 검사했습니다. 복구가 없었거나 응용 프로그램 오류가 반영된 에 대한 예외 만이 선택 해제되었습니다 (예 : )., OutOfMemoryError, 각각 NullPointerException). 그리고 세상은 다시 안전했습니다.

상상 자바 엔지니어 '자바 API 및 컴파일러에서 많은 예외가 체크에 체크되지 않은 변경되었으며, 컴파일러 이 구현에서, 그들은 발견 버그의 구분을 시행 놀라운 ! 따라서 오류를 처리하기위한 최선의 노력은 잘 의도되었지만 으로 충분하지 않았습니다. 즉, 컴파일러는 너무 궤도에 다시 여기에 체크 예외

확인을,해야

4) RemoteException을 :-) 뭔가 유용 입니다. RemoteException을가 RPC 호출에서 삶의 사실이기 때문에 (# 1 참조, # 2)가 예외 안전 코드를 작성하도록 강요 확인 (# 3), 우리는 는 RemoteException을 만드는 것은 확인이 끝난 예외 이을이라고 생각 좋은 생각. 강력한 분산 프로그램을 작성하는 것만으로도 컴파일러 없이도 을 예외없이 사용할 수 있습니다.

그래서 어떤 사람들은 RemoteException이 다음과 같다고 주장 할 수도 있습니다. OutOfMemoryError; 원격 호출에 실패 할 경우 프로그램이 죽을 것입니다. 이 점에 동의하지 않습니다. 예, 에서 일부 경우에는 에서 복구가 없습니다. RemoteException; 그러나 안정적인 분산 프로그램을 작성하는 경우 클라이언트는 실패를 감지하고 적절히 재 시도해야합니다. 다른 서버에 문의하거나 sort의 트랜잭션을 중단해야 할 수도 있습니다. RemoteException이 으로 처리되지 않으면 최대로 확산되고 은 클라이언트를 크래시합니다 (yuk).

기타 지역 경우에는 예외 거래 할 필요가 없습니다 지역의 경우 모두 원격 경우 클라이언트에서 사용되는 일부 원격 인터페이스가 있다는 것을 언급 그래서는 RemoteException는 안 은 throws 절에 있어야하고 처리는 필수가 아니어야합니다. 우리가 RemoteException을 생략하기 위해 원격 인터페이스를 방법을 허용 검사되지 않은 는 RemoteException를 슬로우 스텁 을 생성하는 "rmic의"스위치가 있다면 는 지금의 클라이언트문제 없음 선택의 여지가있다. 예외 처리 결정은 클라이언트 과 함께 남아 있어야합니다. 인터페이스를 정의하면 확인되지 않은 예외 만 throw됩니다. 은 예외를 처리 할 때 을 처리 할 때 클라이언트에게 도움이되는 클라이언트를 작성할 수 없습니다. 위의 예제에서 이미 을 보았습니다. 예외를 확인하면 강력한 코드가됩니다.

다시 지금 을 팝업하고있다 또 다른 문제

개발자는 단순히 로컬 인터페이스를 번역하고 원격 인터페이스로 사용 할 필요가 있다는 것입니다. 인터페이스가 을 배포에 사용하기 적합 하지 않을 수 동시성 및 부분 실패 염두에 통화 대기 시간, 인터페이스에 의해 캡처 된 프로토콜 으로 설계되지 않은 경우이 는 경우 작은 세트 일 수 있지만, 케이스. 충분한 정보가 에 전달되어 작전을 멱등 원로하게 만드나요? 아마도,하지만 가능성이 높습니다. 모든 에 RemoteException을 넣기

절은 고통, 하지만 강력한 분산 응용 프로그램을 작성하기위한 지불의 가격처럼 보일 수도있다 던졌습니다.

- 앤 Wollrath

+1

그녀는 사람들이 체크 예외의 개념조차 가지고 있지 않은 언어로 "강력한 분산 응용 프로그램"을 작성하지 않았다고 확신합니다. 나는 그녀가 지난 세기에 담배를 피우고있는 것의 약간을 갖고 싶다. 강한 소리를 낸다. – SyntaxT3rr0r

+7

@Downvoter 나는이 답변이 왜 왜 내려 졌는지 궁금하다. 저자와 의견이 다를지라도 의견이 아닌 ** 참고 **를 게시하고 있습니다. 감정적 인 downvotes는 어리 석다. –

+1

나는 체크 아웃 된 예외에 대한 자신의 감정에 관계없이, 아마도 이것이 아마도 당신이 얻을 수있는 질문에 대한 가장 정확한 답 일 때, 왜 누군가가 이것을 downvote하는지 상상할 수 없다. – ColinD

4

NullPointerException의 잠재력은 RemoteException보다 훨씬 큽니다. 객체의 메소드를 호출하는 코드 (실질적으로 모든 Java 코드를 의미)는 잠재적으로 NullPointerException을 던질 수 있습니다. RMI 코드 만 RemoteException을 던질 수 있습니다. 이것은 "모든 코드"의 작은 하위 집합입니다.

디자이너는 RMI 라이브러리를 작성할 때 클라이언트 코드가 이러한 예외를 처리 할 것으로 예상하기로 결정했습니다. 원격 코드 실행의 본질을 고려할 때, 나는 그것이 합리적이라고 생각한다.

0

java.rmijavax.rmi 패키지 (및 그 서브)에서 코드에 적용 RemoteException 외에도, RemoteExceptionSocketException이 훨씬처럼 IOException의 일종입니다 ... 모든 IOException의 예외를 검사합니다.

+0

나는 downvote하지 않을거야,하지만이 대답은 RuntimeException되지 않을 수있는 가능한 이유가 아닙니다. RemoteException은 IOExeption 대신 Exception 유형일 수 있습니다. IOException은 확인 예외로 결정한 후 결정됩니다. –

+0

통신을 다루는 Java의 모든 예외는'IOException'의 서브 클래스입니다. 'IOException' (그리고'RuntimeException'보다는'Exception'을 상속받은 다른 클래스들)은 체크 된 예외이므로, 그것으로부터 상속받은 모든 클래스들도 예외를 체크합니다. – Powerlord

2

내가 그것을 이해하는 방법은 다음과 같습니다

  • 들이 RuntimeException을 예방했다 것들을 던져진다.
  • 보호 할 수 없지만 복구 할 수있는 것들에 대해서는 예외가 발생합니다.
  • 보호 할 수없고 복구 할 수없는 것들에 대해서는 오류가 발생합니다.

예를 들어, NullPointerExceptions는 항상 피할 수 있으므로 예외가 확인되지 않습니다. RemoteException는, 네트워크 장해가있는 경우에 발생할 가능성이 있습니다. 이것은, 메서드 호출 전에 합리적으로 방지 할 수 없기 때문에, 검사됩니다.

+1

나는 목록에서 "예외"와 "RuntimeExceptions"을 뒤집 었다고 생각합니다. 'NullPointerException'은'RuntimeException'입니다. – Matthew

+0

아하, 예! 감사합니다 – Steve

관련 문제