IllegalArgumentException sau NullPointerException pentru un parametru nul?

1. Introducere

Printre deciziile pe care le luăm în timp ce ne scriem cererile, multe sunt despre momentul în care aruncăm excepții și ce tip aruncăm.

În acest tutorial rapid, vom aborda problema excepției de aruncat atunci când cineva trece un parametru nul la una dintre metodele noastre: IllegalArgumentException sau NullPointerException .

Vom explora subiectul examinând argumentele pentru ambele părți.

2. IllegalArgumentException

În primul rând, să analizăm argumentele pentru aruncarea unei excepții IllegalArgumentException .

Să creăm o metodă simplă care aruncă o excepție IllegalArgumentException atunci când este trecut un nul :

public void processSomethingNotNull(Object myParameter) { if (myParameter == null) { throw new IllegalArgumentException("Parameter 'myParameter' cannot be null"); } }

Acum, să trecem la argumentele în favoarea IllegalArgumentException .

2.1. Este modul în care spune Javadoc să-l folosească

Când citim Javadoc pentru IllegalArgumentException , se spune că este folosit atunci când o valoare ilegală sau inadecvată este transmisă unei metode . Putem considera un obiect nul ca fiind ilegal sau inadecvat dacă metoda noastră nu se așteaptă, iar aceasta ar fi o excepție adecvată pentru noi.

2.2. Se potrivește cu așteptările dezvoltatorilor

În continuare, să ne gândim la modul în care noi, ca dezvoltatori, gândim când vedem urmele stivei în aplicațiile noastre. Un scenariu foarte comun în care primim o NullPointerException este atunci când am încercat din greșeală să accesăm un obiect nul . În acest caz, vom merge cât mai adânc în stivă, pentru a vedea la ce ne referim, care este nul .

Când primim o excepție IllegalArgumentException , este probabil să presupunem că transmitem ceva greșit unei metode. În acest caz, vom căuta în stivă metoda cea mai de jos pe care o apelăm și vom începe depanarea de acolo. Dacă luăm în considerare acest mod de gândire, excepția IllegalArgumentException ne va aduce în stiva noastră mai aproape de locul în care se face greșeala.

2.3. Alte argumente

Înainte de a trece la argumentele pentru NullPointerException , să ne uităm la câteva puncte mai mici în favoarea IllegalArgumentException . Unii dezvoltatori consideră că numai JDK ar trebui să arunce NullPointerException . După cum vom vedea în secțiunea următoare, Javadoc nu susține această teorie. Un alt argument este că este mai consecvent să utilizați IllegalArgumentException, deoarece acesta este ceea ce am folosi pentru alte valori ilegale ale parametrilor.

3. NullPointerException

În continuare, să luăm în considerare argumentele pentru NullPointerException .

Să creăm un exemplu care aruncă o NullPointerException :

public void processSomethingElseNotNull(Object myParameter) { if (myParameter == null) { throw new NullPointerException("Parameter 'myParameter' cannot be null"); } }

3.1. Este modul în care spune Javadoc să-l folosească

Conform Javadoc pentru NullPointerException , NullPointerException se intenționează a fi utilizat pentru încercarea de a utiliza nul acolo unde este necesar un obiect . Dacă parametrul metodei noastre nu este intenționat să fie nul , atunci am putea considera în mod rezonabil acest lucru ca un obiect necesar și aruncă NullPointerException .

3.2. Este compatibil cu API-urile JDK

Să luăm un moment să ne gândim la multe dintre metodele comune JDK pe care le numim în timpul dezvoltării. Mulți dintre ei aruncă o NullPointerException dacă oferim un Null . În plus, Objects.requireNonNull () aruncă o NullPointerException dacă trecem în Null. Conform documentației Objects , există mai ales pentru validarea parametrilor.

În plus față de metodele JDK care aruncă NullPointerException , putem găsi și alte exemple de tipuri de excepții specifice care sunt aruncate din metode în API-ul Collections. ArrayList.addAll (index, Colectia) aruncă o IndexOutOfBoundsException în cazul în care indicele este în afara dimensiunea listei și aruncă o NullPointerException în cazul în care colecția este nulă . Acestea sunt două tipuri de excepții foarte specifice, mai degrabă decât cea mai generică IllegalArgumentException .

Am putea considera IllegalArgumentException ca fiind conceput pentru cazurile în care nu avem la dispoziție un tip de excepție mai specific.

4. Concluzie

După cum am văzut în acest tutorial, aceasta este o întrebare care nu are un răspuns clar. Documentația pentru cele două excepții pare să se suprapună, atunci când sunt luate singure, ambele sună adecvate. Există, de asemenea, argumente convingătoare suplimentare pentru ambele părți, bazate pe modul în care dezvoltatorii își fac depanarea și pe modelele văzute în metodele JDK.

Indiferent de excepția pe care am ales-o, ar trebui să fim consecvenți pe tot parcursul aplicației noastre. În plus, putem face excepțiile noastre mai utile oferind informații semnificative constructorului de excepții. De exemplu, aplicațiile noastre vor fi mai ușor de depanat dacă furnizăm numele parametrului în mesajul de excepție.

Ca întotdeauna, exemplul de cod este disponibil pe GitHub.