2010-04-14 6 views
7

C++에서 생성자가 성공적으로 완료되면 개체의 수명이 시작됩니다. 생성자 내부에서 객체가 아직 존재하지 않습니다.생성자의 예외

Q : 생성자에서 예외를 방출하는 것은 무엇을 의미합니까?

A : 이것은 구성이 실패했거나 개체가 존재하지 않았으며 수명이 시작되지 않았 음을 의미합니다. [source]

내 질문은 : 자바에 대해서도 마찬가지입니까? 예를 들어, this을 다른 객체에 건네면 생성자가 실패합니다.

Foo() 
{ 
    Bar.remember(this); 
    throw new IllegalStateException(); 
} 

잘 정의되어 있습니까? Bar에 비 객체에 대한 참조가 있습니까?

답변

8

개체가 있지만 올바르게 초기화되지 않았습니다.

이것은 예외 발생시뿐만 아니라 this이 누출 될 때마다 발생할 수 있습니다.

일반적으로 가정 된 보장이이 상황에서 유효하지 않기 때문에 매우 문제가있는 상황입니다 (예 : final 필드가 작성 중에 값이 변경 될 수 있음).

그러므로 생성자에 this이 누출되지 않도록해야합니다.

This IBM developerWorks article에는 개체를 구성 할 때주의 사항과 그주의 사항에 대한 설명이 나와 있습니다. 이 기사에서는 멀티 스레딩과 관련하여 주제에 대해 설명하지만 알 수없는/신뢰할 수없는 코드가 생성 중에 this에 대한 참조를 얻으면 단일 스레드 환경에서 유사한 문제를 가질 수 있습니다.

+1

+1 -이 경우 "누출"은 (안전하지 않은) "게시"라고합니다. 예 : 블로흐. 또한 이것을 더 깊이 설명하는 것이 좋습니다. –

1

생성자에서 파일 작성기와 같은 리소스를 절대 열지 마십시오. 대신 init 메소드를 생성하고 거기에서 수행하십시오. 그럼 안전 해.

+2

* "그렇다면 안전합니다"*. 그 진술은 명백하게 거짓이다 !! 생성자에서 예외를 발생시킬 수있는 ** 많은 ** 것들이 있습니다. 예 : 잘못된 인수, NPE, 배열 인덱스 등, 스택 오버플로 또는 메모리 부족 오류까지 포함 할 수 있습니다. –

+0

좋은 조언이지만 생성자가 실패 할 수있는 다른 경우가 있습니다. 예를 들어 여기에 설명 된대로 병렬 반복기를 원한다. http://stackoverflow.com/questions/3137944/best-way-to-iterate-over-two-lists-simultaneously 그래서리스트를 체크하고 싶다. 건설 시간. –

0

이 코드는 예외가 아니며 C++에서는 예외가 없습니다. 사용하는 언어에 관계없이 동일한 버그입니다.