2010-03-25 3 views
47

내가 널 반환하는 대신 예외를 발생하고자하는이 방법중요한 매개 변수/종속성이 누락 된 경우 throw 할 예외는 무엇입니까?

/** 
* @return List of group IDs the person belongs to 
* 
*/ 
public List<String> getGroups() { 
    if (this.getId().equals("")) return null; 
} 

, 중요한 매개 변수/종속 관계가 설정되어 있지 않은 경우 던질 예외가 무엇을 가지고?

+6

getID()가 null을 반환하면이 코드는 NPE를 발생시킵니다. 'if ("".equals (this.getId())) ... "를 사용하는 것이 더 낫습니다. –

+0

나는 추상 클래스에 정의되어 있고 내부에 try catch가 있으며 실패시 빈 문자열을 반환합니다. – Pentium10

답변

71

매개 변수/인수가 외부에서 제어되는 경우 IllegalArgumentException을 사용하고, 메서드가 잘못된 순간 (상태)에서 방금 호출되는 경우 IllegalStateException을 사용합니다. 당신의 특정한 경우에 나는 그것이 후자라고 생각합니다. A (모호한) 대안은 NullPointerException입니다.

그러나 이것은 사용자가 이유를 이해할 수 있도록 @throws에 명시 적으로 문서화되어야합니다.

+0

질문 문맥은 실제로 제한됩니다. 내가 볼 수있는 한 ISE가 최선의 선택입니다. 나는 또한 명시 적으로, 그렇게 나쁜 방법을 보지 못했다. :) – BalusC

+0

마술이있다. @params가 빠져서 @throws 섹션을 자동으로 다시 생성하도록 Eclipse에서 주석 섹션을 어떻게 업데이트 할 수 있습니까? 어쩌면 지름길일까요? – Pentium10

+0

죄송합니다, 몰라요. 이것은 런타임 예외가 아닌 경우 ('throws' 절을 생성/업데이트 할 때)에 자동으로 추가되지만 런타임 예외에 대해서는 자동으로 추가되지 않습니다. – BalusC

2

id는 소유자의 상태이므로 IllegalStateException을 사용합니다. id가 매개 변수로 전달 된 경우 IllegalArgumentException이 올바를 것입니다.

0

예외를 확장하여 내 자신의 예외 유형을 생성합니다. 그런 식으로 함수를 호출하면 해당 특정 예외를 catch하고 적절하게 정상적으로 처리 할 수 ​​있습니다. 예외를 확장하는 것에 대해서도 똑같은 일을 할 수 있지만, 제 예외 처리에서 매우 강력 할 수 있도록 내 자신의 Exception 클래스를 만드는 것을 선호합니다. 이것은 물론 당신에게 달려 있습니다.

+0

왜 바퀴를 다시 태어 났을까요? IllegalArgumentException는, 부정한 인수에 정확하게 행해진 다. –

+0

얼마나 많은 다른 유형의 잘못된 인수를 트래핑 할 것인가에 달려 있습니다. Excpetion을 확장하거나이 경우 IllegalArgumentException을 확장하는 것이 좋습니다. 처리하려는 여러 유형의 조건을 처리 할 특정 Exception 클래스가 있어야합니다. IMHO는 예외 처리를보다 쉽고 강력하게 만듭니다. - 제이 – Jay

2

id가 항상 설정되어 있는지 확인하려면 (예를 들어 생성자에서 올바른 ID가 전달되었는지 확인할 수있는 곳에서 요구함으로써) IllegalStateException을 던지려는 다른 제안이 올바른 것 같습니다. 그러나 가능한 한 먼저 객체가이 상태에 들어갈 수 없도록 보장하는 것이 좋습니다.

1

예외를 발생시키는 대신 빈 목록을 반환해야합니다. 종속성/매개 변수가 충족되지 않으면 결과가 없습니다. 게시 된 주석과 코드에서 예상되는 동작 인 것처럼 보입니다. id가 비어 있으면 그룹이 연결되지 않으므로 빈 목록이됩니다.

관련 문제