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


503

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

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

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

57
무엇을하든 문서화해야합니다. 나는이 점이 정확히 어떤 접근 방식이 "최고"인지보다 중요하다고 생각합니다.
Rik

6
프로그래밍 언어의 관용구에 따라 다릅니다. 이 질문에 프로그래밍 언어 태그로 태그하십시오.
Teddy

3
null을 반환하는 것은 성공 또는 실패를 의미 할 수 있으며 정보가 많지 않은 경우가 많습니다 (일부 방법은 여러 가지 방법으로 실패 할 수 있음). 라이브러리는 예외를 더 잘 처리하여 오류를 명시 적으로 작성해야하며, 이렇게하면 기본 프로그램이 오류를 더 높은 수준에서 처리하는 방법을 결정할 수 있습니다 (내장 오류 처리 논리와 달리).
3k-

1
실제 질문은 실체를 찾을 수없는 예외적 인 것으로 간주해야하는 이유이며, 그렇다면 왜 그런가? 아무도 그 결론에 도달하는 방법에 대해 충분히 대답하지 못했으며 이제는 Q & A가 마감되었습니다. 업계가이 중요한 주제에 대해 합의에 이르지 못했다는 진정한 부끄러움. 예, 나는 그것이 알고 따라 달라집니다 . 이 "예외적 인 경우에하는 것은, 던져"보다 더에 따라 왜 이렇게, 설명
호감

답변:


484

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

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

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


30
@ Ken : +1, 예외를 던지지 만 HasItem (...)과 같은 우선 순위를 감지 할 수 있다면 사용자는 Has * 또는 Contains 메소드를 제공해야한다고 언급하는 것이 좋습니다.
user7116

4
값을 반환하거나 값이없는 경우 null을 반환하는 대신 Maybe <T>를 반환하는 것이 좋습니다. mikehadlow.blogspot.nl/2011/01/monads-in-c-5-maybe.html을 참조하십시오 .
Erwin Rooijakkers

2
@ErwinRooijakkers의에서 디자인 선택 방법 , 자바 (8) 당신은 또한 반환 수있는 옵션 <T>
호세 Andias

2
나는 모든 대답이 약간의 혼란을 불러 일으킨다는 것을 발견했다. "만약 예외적이라면 던져라." 대부분의 엔지니어는이 원칙에 익숙 할 것입니다. 내 생각에, 여기의 실제 질문은 그것이 예외적 인 것으로 간주 되어야 하는지 결정하는 방법 입니다. OP는 예를 들어 리포지토리 패턴과 같은 모범 사례 를 찾고 있습니다. 기본 키가 주어지면 객체가 존재하지 않는 것이 일반적으로 예외적 인 것으로 간주됩니까? 그렇습니다. 그의 영역이 결정할 것이지만, 수년간의 경험을 가진 대부분의 전문가들은 무엇을 제안합니까? 그것이 우리가보아야 할 대답의 유형입니다.
호감

4
@crush 가이 딩 원칙은 매개 변수가 함수에 전달되는 것 입니다. 기본 키를 언급 한 것처럼 identity 를 전달 하면 해당 항목을 찾을 수 없는 경우 시스템에서 일관성이없는 상태를 나타내 므로 예외적 인 것으로 간주해야합니다 . 예 : GetPersonById(25)그 사람이 삭제되었지만 GetPeopleByHairColor("red")빈 결과를 반환하면 던집니다 . 그래서 매개 변수는 기대에 대해 뭔가를 말합니다.
John Knoop

98

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

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


4
동의하지 않습니다. 상태 코드로 예외를 throw 할 수 있습니다. "NotFoundException"
ACV

확실히 선호의 문제가되어서는 안됩니다. 이것이 우리가 일관성없는 코드로 끝나는 방식입니다. 팀 코드가 아닌 경우 다른 개발자 코드를 자신의 외부 라이브러리와 얽매일 때 거의 확실합니다.
호감

4
null 사례를 처리하는 것이 "NotFoundException"보다 훨씬 쉽다고 생각합니다. "NotFoundException"을 발생시키는 모든 검색 요청마다 몇 줄의 try-catch를 작성해야하는지 생각해보십시오. 모든 코드를 제 눈에 준비하는 것은 고통 스럽습니다.
visc

Tony Hoare의 말을 인용하겠습니다 : "나는 그것을 10 억 달러의 실수라고 부릅니다." 나는 null을 반환하지 않을 것입니다. 예외를 던지고 올바르게 처리하거나 빈 객체를 반환합니다.
7

70

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

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


게다가 좋은 옛날에는 빠른 더러운 "일시적인"수정으로 몇 번 이상 그랬습니다 ... 좋은 생각이 아닙니다. 특히 당신이 학생이라면 검토 될 것입니다.
rciafardone

14
연맹 옵션이 나에게 멋진 듯 때부터 아래로 투표에 가고 있었다 ...하지만 분명히 나는 심장이
swestner

5
새로운 WtfExcepti😲n 던지기
Kamafeather

이 답변이 메소드가 항상 객체를 "때때로 null"로 반환하는 이유에 대해 이야기하면 도움이 될 것이라고 생각합니다. 그러한 상황을 보증하는 것은 무엇입니까? 그러한 상황이 언제 존재할 수 있는지 예를 들어보십시오.
호감

51

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
만약 C #이 실제 튜플을 제공한다면 이것은 더 유용한 제안이 될 것이므로 [out] 파라미터 사용을 피할 수 있습니다. 여전히 이것이 선호되는 패턴이므로 +1입니다.
Erik Forbes

2
제 생각에는 try 접근 방식이 가장 좋습니다. 객체를 반환 할 수없는 경우 어떻게되는지 찾아 보지 않아도됩니다. Try 메서드를 사용하면 수행 할 작업을 즉시 알 수 있습니다.
OregonGhost

저를 생각 나게 find하고 findOrFailLaravel 웅변에서
vivoconunxino

@ErikForbes 나는 당신의 의견이 오래되었다는 것을 알고 있지만, 그 TryFindObject방법 에서 반환되는 다중 속성 객체를 정의하는 것이 답이 아니 겠습니까? 튜플은 여러 값을 캡슐화하는 객체를 정의하는 데 시간을 들이고 싶지 않은 프로그래머에게는 게으른 패러다임처럼 보입니다. 그것은 본질적으로 모든 튜플이 어쨌든 핵심입니다.
호감

@crush-명명 된 Tuple 리터럴은 옵션 인 IMO입니다. 튜플이있는 비동기 Try Get 패턴에 대한 링크입니다. stackoverflow.com/questions/1626597/…
Ttugates

26

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

  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);

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

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


명확한 함수 이름, 특히 orCreate 및 orDefault가 마음에 듭니다.
marcovtwout

5
이것의 대부분은 더 명확하게 작성 할 수 있습니다 Expected<T> findObject(String)경우 Expected<T>기능이있다 orNull(), orThrow(), orSupplied(Supplier<T> supplier), orDefault(T default). 이것은 오류 처리로부터 데이터를 얻는 것을 추상화합니다.
WorldSEnder

지금까지 Expected <T>에 대해 몰랐습니다. 나는 꽤 새로운 것처럼 보이고 원래의 답변을 쓸 때 존재하지 않았을 수 있습니다. 귀하의 의견을 올바른 답변으로 만들어야 할 수도 있습니다.
Lena Schimmel

또한 Expected <T>는 C ++ 템플릿입니다. 다른 객체 지향 언어로도 구현되어 있습니까?
Lena Schimmel

Java 8에서는 Optional <T> (다른 언어에서는 Maybe <T> 등)를 반환하는 것도 옵션입니다. 이것은 호출자에게 아무것도 반환하는 것이 가능하지 않다는 것을 분명히 나타내며, 호출자가 확인하지 않더라도 (어쨌든 Java에서) 컴파일되는 null과 달리 호출자가 해당 가능성을 처리하지 않으면 컴파일되지 않습니다. .
일부 남자

18

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


이것이 실제 답변입니다. null 반환은 게으른 프로그래머의 끔찍한 습관입니다.
jeremyjjbrown

이 답변이 아직 정상에 투표하지 않았다는 것을 믿을 수 없습니다. 이것이 진정한 해답이며, 두 가지 접근 방식은 모두 쉬운 방법이며 많은 코드 팽창 또는 NPE를 절약합니다.
Bane


3
null 객체 패턴을 사용하는 경우 키가 null 객체에 매핑 된 경우와 키가 매핑되지 않은 경우를 어떻게 구별 할 수 있습니까? 의미없는 객체를 반환하는 것이 null을 반환하는 것보다 훨씬 나쁠 것이라고 생각합니다. 처리 할 준비가되지 않은 코드에 null을 반환하면 일반적으로 예외가 발생합니다. 최적의 예외 선택은 아니지만 예외입니다. 무의미한 객체를 반환하면 무의미한 데이터가 올바른 코드가 잘못 될 가능성이 높습니다.
supercat

3
엔티티 조회에 대해 널 오브젝트가 어떻게 작동합니까? 예를 들어, Person somePerson = personRepository.find("does-not-exist");이 메소드가 ID의 null 객체를 반환한다고 가정 해 봅시다 does-not-exist. 그렇다면 올바른 행동은 somePerson.getAge()무엇입니까? 지금은 null 개체 패턴이 엔티티 조회에 적합한 솔루션이라고 아직 확신하지 않습니다.
압둘

13

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


13

예외를 던질 때의 장점 :

  1. 호출 코드의보다 깨끗한 제어 흐름. null을 확인하면 try / catch에서 기본적으로 처리되는 조건부 분기가 삽입됩니다. null 확인은 무엇을 확인하고 있는지를 나타내지 않습니다. 예상 오류를 찾고 있기 때문에 null을 확인하고 있습니까? 아니면 null을 확인하여 다운 체인에서 더 이상 전달하지 않습니다. ?
  2. "널"의 의미에 대한 모호성을 제거합니다. 널을 오류를 나타내거나 실제로 값에 저장된 것을 널입니까? 그 결정을 근거로 단 하나의 말이있을 때는 말하기 어렵다.
  3. 응용 프로그램에서 메서드 동작 간의 일관성이 향상되었습니다. 예외는 일반적으로 메서드 시그니처에 노출되므로 응용 프로그램의 메서드가 처리해야하는 가장 중요한 경우와 응용 프로그램이 예측 가능한 방식으로 어떤 정보에 반응 할 수 있는지 더 잘 이해할 수 있습니다.

예제에 대한 자세한 설명은 http://metatations.com/2011/11/17/returning-null-vs-throwing-an-exception/을 참조하십시오.


2
포인트 2가 우수하기 때문에 +1-null은 찾을 수없는 것과 동일한 의미를 갖지 않습니다. 이 동적 언어를 처리 할 때 널 실제로 기능에 의해 검색 저장되는 객체 / 할 수있는 곳 더 중요하게 -이 경우와
아담 Terrey

1
포인트 # 2에 +1 널 오류입니까? 주어진 키에 대해 저장된 것이 null입니까? 키가 존재하지 않음을 나타내는 null입니까? 이것들은 null을 반환하는 것이 거의 정확하지 않다는 것을 분명히하는 실제 질문입니다. 이 가능성이 여기에 "이 뛰어난 있다면, 던져"다른 사람들이 단지 모호한을 던지고있다으로 가장 좋은 대답이다
호감

12

귀하의 언어와 코드가 LBYL (도약하기 전에) 또는 EAFP (허가보다 용서를 구하기 쉬운)로 홍보하는지에 따라 다릅니다.

LBYL은 값을 확인해야한다고 말합니다 (그래서 null을 반환)
한다고 EAFP는 작업을 시도하고 실패했는지 확인합니다 (예외 발생).

예외입니다. 예외 / 오류 조건에는 예외를 사용해야하며 검사를 사용할 때는 null을 반환하는 것이 가장 좋습니다.


Python의 EAFP 및 LBYL :
http://mail.python.org/pipermail/python-list/2003-May/205182.html ( 웹 아카이브 )


3
경우에 따라 EAFP가 유일하게 의미있는 접근 방식입니다. 예를 들어, 동시지도 / 사전에서는 요청시 매핑이 존재하는지 여부를 확인할 수있는 방법이 없습니다.
supercat

11

"물건을 찾을 수없는 예외적 인 경우"입니까? 프로그램의 정상적인 과정에서 발생할 것으로 예상되는 경우 예외가 발생하지 않아야합니다 (예외 동작이 아니기 때문에).

짧은 버전 : 예외 동작을 사용하여 프로그램의 정상적인 제어 흐름을 처리하지 말고 예외적 인 동작을 처리하십시오.

앨런


5

예외는 계약에 의한 설계와 관련이 있습니다.

객체의 인터페이스는 실제로 두 객체 간의 계약이므로 호출자가 계약을 충족해야합니다. 그렇지 않으면 수신자가 예외로 실패 할 수 있습니다. 가능한 두 가지 계약이 있습니다

1) 모든 입력 방법은 유효합니다.이 경우 객체를 찾을 수 없으면 null을 반환해야합니다.

2) 일부 입력 만 유효합니다. 즉, 찾은 객체가 생성됩니다. 이 경우 발신자가 입력이 올바른지 확인할 수있는 두 번째 방법을 제공해야합니다. 예를 들어

is_present(key)
find(key) throws Exception

두 번째 계약의 두 가지 방법을 모두 제공하는 경우에만 예외가 발생할 수 있습니다.


4

나는 null을 반환하고 호출자를 사용하여 적절하게 처리하는 것을 선호합니다. (더 나은 단어가없는 경우) 예외는 내가 절대적으로 '확실한'경우이 방법은 객체를 반환한다는 것입니다. 이 경우 실패는 예외적이어야하며 던져야합니다.


4

개체를 찾을 수 없다는 의미에 따라 다릅니다.

정상 상태 인 경우 null을 반환합니다. 이것은 가끔 발생할 수있는 일이므로 발신자가 확인해야합니다.

오류 인 경우 예외를 throw하면 호출자가 누락 된 개체의 오류 조건으로 수행 할 작업을 결정해야합니다.

대부분의 사람들은 일반적으로 예외가 발생했을 때 예외를 사용하는 것이 좋습니다.


2
" 정상 상태 "진술에 대해 어떻게 설명하고 어떤 기준을 오류와 구별하기 위해 사용할 것입니까?
user1451111

4

여기 몇 가지 제안이 더 있습니다.

컬렉션을 반환하는 경우 null 반환을 피하고 빈 컬렉션을 반환하면 null 확인없이 열거를 쉽게 처리 할 수 ​​있습니다.

여러 .NET API는 thrownOnError 매개 변수의 패턴을 사용하여 호출자가 실제로 예외적 인 상황인지 여부 또는 객체를 찾을 수 없는지 여부를 선택할 수 있습니다. Type.GetType이 이에 대한 예입니다. BCL의 또 다른 일반적인 패턴은 부울이 리턴되고 값이 출력 매개 변수를 통해 전달되는 TryGet 패턴입니다.

일부 상황에서는 기본 설정이거나 동작이없는 버전 일 수있는 Null 개체 패턴을 고려할 수도 있습니다. 핵심은 코드 기반에서 널 검사를 피하는 것입니다. 자세한 내용은 여기를 참조하십시오 http://geekswithblogs.net/dsellers/archive/2006/09/08/90656.aspx


3

일부 기능에서 매개 변수를 추가합니다.

..., bool verify = true)

True는 throw를 의미하고 false는 일부 오류 반환 값을 반환합니다. 이런 식으로이 기능을 사용하는 사람은 두 가지 옵션이 있습니다. 오류 처리를 잊어 버린 사람들을 위해 기본값은 true입니다.


3

예외를 발생시키는 대신 널을 리턴하고 API 문서에서 널 리턴 값의 가능성을 명확하게 문서화하십시오. 호출 코드가 API를 존중하지 않고 null 경우를 확인하면 어쨌든 일종의 "널 포인터 예외"가 발생합니다. :)

C ++에서는 객체를 찾는 메소드를 설정하는 3 가지 맛을 생각할 수 있습니다.

옵션 A

Object *findObject(Key &key);

객체를 찾을 수 없으면 null을 반환합니다. 좋고 간단합니다. 나는 이것과 함께 갈 것이다. 아래의 대안은 매개 변수를 싫어하는 사람들을위한 것입니다.

옵션 B

void findObject(Key &key, Object &found);

객체를받을 변수에 대한 참조를 전달하십시오. 객체를 찾을 수 없을 때 메소드에서 예외가 발생했습니다. 이 규칙은 객체를 찾을 수 없을 것으로 예상되는 경우에 더 적합 할 수 있습니다. 따라서 예기치 않은 경우임을 나타내는 예외를 발생시킵니다.

옵션 C

bool findObject(Key &key, Object &found);

객체를 찾을 수 없으면이 메소드는 false를 리턴합니다. 옵션 A에 비해이 방법의 장점은 한 번의 명확한 단계로 오류 사례를 확인할 수 있다는 것입니다.

if (!findObject(myKey, myObj)) { ...

3

null이 예외적 인 행동으로 간주되지 않는 경우에만 참조 try 메서드를 사용하는 것이 분명합니다. 여기에서 말한 것처럼 "책을 읽거나"도약하기 전에 볼 필요가 없습니다.

그래서 기본적으로:

bool TryFindObject(RequestParam request, out ResponseParam response)

이는 사용자의 코드도 명확하다는 것을 의미합니다

...
if(TryFindObject(request, out response)
{
  handleSuccess(response)
}
else
{
  handleFailure()
}
...

2

클라이언트 코드가 found와 not found의 차이점을 아는 것이 중요하고 이것이 일상적인 동작으로 간주되는 경우 null을 반환하는 것이 가장 좋습니다. 그러면 클라이언트 코드가 수행 할 작업을 결정할 수 있습니다.


2

일반적으로 null을 반환해야합니다. 메소드를 호출하는 코드는 예외를 던지거나 다른 것을 시도할지 여부를 결정해야합니다.


2

또는 옵션을 반환

옵션은 기본적으로 클라이언트가 부스 케이스를 처리하도록하는 컨테이너 클래스입니다. 스칼라는이 개념을 가지고 있습니다. API를 찾으십시오.

그런 다음이 객체에 T getOrElse (T valueIfNull)과 같은 메소드가 있습니다. 그러면 찾은 객체를 반환하거나 클라이언트가 지정하는 대안을 반환합니다.


2

null 반환을 선호합니다-

발신자가 확인하지 않고 사용하면 예외가 바로 발생합니다.

발신자가 실제로 사용하지 않으면 try/ catch블록에 세금을 부과하지 마십시오


2

불행히도 JDK는 일관성이 없습니다. 자원 번들에서 기존 키가 아닌 키에 액세스하려고하면 예외가 발생하지 않으며 맵에서 값을 요청하면 존재하지 않으면 null이됩니다. 따라서 찾은 값이 null 일 수 있으면 승자 응답을 다음과 같이 변경하고 찾지 못하면 예외를 발생시키고 그렇지 않으면 null을 반환합니다. 따라서 가치를 찾을 수없는 이유를 알아야하는 경우 항상 예외를 제기하십시오.


1

객체에 대한 참조 를 반환하는 한 NULL을 반환하는 것이 좋습니다.

그러나 전체 피의 것을 돌려주는 경우 (C ++에서와 같이 : 'return & blah;'(또는 'blah'는 포인터)가 아닌 'return blah;'인 경우), NULL을 반환 할 수 없습니다. 이 경우 예외를 던지거나 성공 플래그가 설정되지 않은 빈 개체를 반환하면 문제에 어떻게 접근 할 수 있습니까?


1

예외 처리에서 오버 헤드를 언급 한 사람은 없다고 생각하십시오. 실제 앱 종료 또는 프로세스 중지 이벤트 (앞으로 진행하는 것이 좋은 것보다 더 많은 해를 입힐 수 있음)가 아니라면 예외를로드하고 처리하는 데 추가 리소스가 필요합니다. 호출 환경이 적절하다고 해석 할 수있는 가치.


1

나는 여기에 합의 된 것으로 보인다 ( "찾을 수 없음"이 정상적인 결과 일 경우 null을 반환하거나 상황의 의미론이 항상 개체를 찾도록 요구하면 예외를 던진다).

그러나 특정 상황에 따라 세 번째 가능성이 있습니다. 메소드는 "찾을 수 없음"조건에서 일종의 기본 오브젝트를 리턴하여 호출 검사 코드가 널 점검이나 예외 포착없이 항상 유효한 오브젝트를 수신 할 수 있도록합니다.


1

null을 반환하면 예외는 정확히 다음과 같습니다. 코드에서 예상하지 못한 작업입니다.



1

메소드가 컬렉션을 반환하면 빈 컬렉션을 반환합니다 (위와 같이). 그러나 Collections.EMPTY_LIST 등은 사용하지 마십시오! (자바의 경우)

메소드가 단일 오브젝트를 검색하는 경우 몇 가지 옵션이 있습니다.

  1. 메소드가 항상 결과를 찾아야하고 객체를 찾지 않는 실제 예외 사례 인 경우 예외를 처리해야합니다 (Java : 검사되지 않은 예외를 확인하십시오).
  2. (Java에만 해당) 메소드가 확인 된 예외를 처리하는 것을 허용 할 수있는 경우 프로젝트 특정 ObjectNotFoundException 등을 처리하십시오. 이 경우 예외 처리를 잊어 버린 경우 컴파일러에서 알려줍니다. (이것은 Java에서 찾을 수없는 것들을 선호하는 처리 방법입니다.)
  3. 실제로 괜찮다고 말하면 객체를 찾을 수없고 메소드 이름이 findBookForAuthorOrReturnNull (..)과 같으면 null을 반환 할 수 있습니다. 이 경우입니다 강력 널 확인없이 정적 수표 또는 컴파일러 검사, 결과의 역 참조 느릅 나무 방지의 일종을 사용하는 recomminded. Java의 경우 예를 들어 가능합니다. FindBugs (의 DefaultAnnotation 참조) http://findbugs.sourceforge.net/manual/annotations.html의 참조 ) 또는 IntelliJ-Checking.

널을 리턴하기로 결정한 경우주의하십시오. 프로젝트의 유일한 프로그래머가 아닌 경우 런타임에 NullPointerExceptions (Java 또는 다른 언어로 된)를 얻을 수 있습니다! 따라서 컴파일 타임에 확인되지 않은 null을 반환하지 마십시오.


코드가 제대로 작성 되었으면 아닙니다 null. 자세한 내용은 최다 투표 답변을 참조하십시오.
앤드류 이발사

그러나 컴파일 타임에 보장하는 경우에만 모든 null이 검사됩니다. 패키지 레벨에서 FindBugs @NutNull을 사용하여 메소드를 "null을 리턴 할 수 있음"으로 표시하십시오. 또는 Kotlin 또는 Nice와 같은 언어를 사용하십시오. 그러나 null을 반환하지 않는 것이 훨씬 간단합니다.
iuzuz

"간단한", 아마도 . 그러나 종종 일반 잘못된
앤드류 바버

1
다시 : 더 많은 정보를 원하시면 가장 많이 투표 된 답변을 읽으십시오. 기본적으로 : 요청 된 책을 찾을 수 없을 것으로 예상되는 결과 인 경우, 요청 된 책을 찾을 수없는 경우 오류가 발생하는 것과 달리 예외는 잘못된 것입니다.
Andrew Barber

1
여기서 많이 오해하고 있습니다. 조건부 조언을 보편적으로 적용하고 있습니다. 이는 거의 항상 나쁜 일입니다. 나머지 투표 한 답변도 읽어보십시오. 당신의 대답은 절대적인 것을 말하고 그것에 대한 매우 잘못된 논리를 제시합니다.
앤드류 이발사

1

라이브러리 또는 예외를 발생시키는 다른 클래스를 사용하는 경우 다시 던져야합니다. 합니다. 다음은 예입니다. Example2.java는 라이브러리와 유사하며 Example.java는 오브젝트를 사용합니다. Main.java는이 예외를 처리하는 예제입니다. 호출 측에서 사용자에게 의미있는 메시지와 (필요한 경우) 스택 추적을 표시해야합니다.

Main.java

public class Main {
public static void main(String[] args) {
    Example example = new Example();

    try {
        Example2 obj = example.doExample();

        if(obj == null){
            System.out.println("Hey object is null!");
        }
    } catch (Exception e) {
        System.out.println("Congratulations, you caught the exception!");
        System.out.println("Here is stack trace:");
        e.printStackTrace();
    }
}
}

Example.java

/**
 * Example.java
 * @author Seval
 * @date 10/22/2014
 */
public class Example {
    /**
     * Returns Example2 object
     * If there is no Example2 object, throws exception
     * 
     * @return obj Example2
     * @throws Exception
     */
    public Example2 doExample() throws Exception {
        try {
            // Get the object
            Example2 obj = new Example2();

            return obj;

        } catch (Exception e) {
            // Log the exception and rethrow
            // Log.logException(e);
            throw e;
        }

    }
}

Example2.java

 /**
 * Example2.java
 * @author Seval
 *
 */
public class Example2 {
    /**
     * Constructor of Example2
     * @throws Exception
     */
    public Example2() throws Exception{
        throw new Exception("Please set the \"obj\"");
    }

}

함수에서 발생하는 예외가 런타임 예외가 아니고 호출자가 프로그램을 종료하는 대신 예외를 처리해야하는 경우 호출자가 예상 할 수없는 내부 서브 시스템에서 예외를 처리하는 대신, 내부 예외를 외부 점검 예외로 랩핑하고 내부 예외를 '체인화'하여 누군가 디버깅 할 때 외부 예외가 발생한 이유를 알아낼 수 있습니다. 예를 들어 example1은 'throw new MyCheckedException ( "\"obj \ "", e)'를 사용하여 발생 된 예외에 'e'를 포함시킬 수 있습니다.
일부 남자

0

실제로 객체를 찾을 지 여부에 따라 다릅니다. 당신이 생각의 학교를 따라 가면 예외가 뭔가를 나타내는 데 사용되어야한다는 예외가 발생했습니다.

  • 발견 된 개체; 객체 반환
  • 개체를 찾을 수 없습니다. 예외를 던지다

그렇지 않으면 null을 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.