[exception] 검색 메소드가 ‘널’을 리턴하거나 리턴 값을 생성 할 수없는 경우 예외를 발생시켜야합니까? [닫은]

객체를 찾으면 반환 해야하는 메소드가 있습니다.

찾을 수 없으면 다음을 수행해야합니다.

  1. null을 돌려 준다
  2. 예외를 던지다
  3. 다른


답변

항상 값을 찾을 것으로 예상되면 누락 된 경우 예외를 처리하십시오. 예외는 문제가 있음을 의미합니다.

값이 없거나 존재할 수 있고 둘 다 응용 프로그램 논리에 유효하면 널을 리턴합니다.

더 중요 : 코드의 다른 곳에서 무엇을합니까? 일관성이 중요합니다.


답변

실제로 오류 인 경우에만 예외를 처리하십시오. 객체가 존재하지 않을 것으로 예상되는 경우 null을 반환합니다.

그렇지 않으면 그것은 선호의 문제입니다.


답변

일반적으로 메소드가 항상 오브젝트를 리턴해야하는 경우 예외와 함께 진행하십시오. 가끔 null을 예상하고 특정 방식으로 처리하려는 경우 null로 이동하십시오.

무엇을 하든지 세 번째 옵션 인 “WTF”라는 문자열을 반환하는 것이 좋습니다.


답변

null이 오류를 나타내지 않으면 null을 반환합니다.

null이 항상 오류이면 예외를 throw합니다.

널이 예외 인 경우 두 루틴을 코딩하십시오. 한 루틴은 예외를 발생시키고 다른 루틴은 출력 매개 변수로 오브젝트를 리턴하고 오브젝트를 찾을 수없는 경우 false를 리턴하는 부울 테스트 루틴입니다.

Try 루틴을 잘못 사용하는 것은 어렵습니다. null을 확인하는 것을 잊어 버리는 것은 정말 쉽습니다.

따라서 null이 오류이면 그냥 작성하십시오.

object o = FindObject();

null이 오류가 아닌 경우 다음과 같은 코드를 작성할 수 있습니다.

if (TryFindObject(out object o)
  // Do something with o
else
  // o was not found


답변

방금 이전에 언급 한 옵션을 요약하여 새로운 옵션을 던져보고 싶었습니다.

  1. null을 돌려 준다
  2. 예외를 던지다
  3. null 객체 패턴을 사용
  4. 부울 매개 변수를 메소드에 제공하여 호출자가 예외를 던지 길 원하는지 선택할 수 있습니다.
  5. 추가 매개 변수를 제공하여 호출자가 값을 찾지 못하면 다시 얻는 값을 설정할 수 있습니다

또는 다음 옵션을 결합 할 수 있습니다.

호출자가 갈 길을 결정할 수 있도록 오버로드 된 getter 버전을 여러 개 제공하십시오. 대부분의 경우 첫 번째 알고리즘 만 검색 알고리즘을 구현하고 다른 알고리즘은 첫 번째 알고리즘 만 둘러 쌉니다.

Object findObjectOrNull(String key);
Object findObjectOrThrow(String key) throws SomeException;
Object findObjectOrCreate(String key, SomeClass dataNeededToCreateNewObject);
Object findObjectOrDefault(String key, Object defaultReturnValue);

하나의 구현 만 제공하기로 선택한 경우에도 이와 같은 명명 규칙을 사용하여 계약을 명확하게하고 다른 구현도 추가하기로 결정할 때 도움이 될 수 있습니다.

당신은 그것을 과도하게 사용해서는 안되지만, 많은 다른 오류 처리 규칙을 가진 수백 개의 다른 응용 프로그램에서 사용할 도우미 클래스를 작성할 때 특히 도움이 될 수 있습니다.


답변

널 오브젝트 패턴을 사용하거나 예외를 던지십시오.


답변

사용중인 API와 일관성을 유지하십시오.