IllegalArgumentException ili NullPointerException za null parametar?

1. Uvod

Među odlukama koje donosimo dok pišemo svoje prijave, mnogima je važno kada treba izbaciti iznimke i koju vrstu baciti.

U ovom brzom vodiču pozabavit ćemo se pitanjem koju ćemo iznimku izbaciti kad netko prođe null parametar jednoj od naših metoda: IlegalArgumentException ili NullPointerException.

Istražit ćemo temu ispitivanjem argumenata obje strane.

2. IlegalArgumentException

Prvo, pogledajmo argumente za bacanje IlegalArgumentException.

Stvorimo jednostavnu metodu koja baca IlegalArgumentException kad je prošao a null:

public void processSomethingNotNull (Object myParameter) {if (myParameter == null) {throw new IllegalArgumentException ("Parametar 'myParameter' ne može biti null"); }}

Sada, prijeđimo na argumente u korist IlegalArgumentException.

2.1. Javadoc to kaže kako se koristi

Kad čitamo Javadoc za IlegalArgumentException, kaže koristi se kada se nelegalna ili neprimjerena vrijednost prenese metodi. Možemo razmotriti a null objekt koji će biti nezakonit ili neprikladan ako ga naša metoda ne očekuje, a ovo bi bila primjerena iznimka za nas.

2.2. Podudara se s očekivanjima programera

Dalje, razmislimo o tome kako mi kao programeri razmišljamo kad u svojim aplikacijama vidimo tragove stogova. Vrlo čest scenarij u kojem dobivamo NullPointerException je kada smo slučajno pokušali pristupiti a null objekt. U ovom ćemo slučaju ući što dublje u hrpu kako bismo vidjeli na što se pozivamo null.

Kad dobijemo IlegalArgumentException, vjerojatno ćemo pretpostaviti da nečemu pogrešno prenosimo metodu. U ovom ćemo slučaju u stogu potražiti najdonju metodu koju pozivamo i od tamo započeti s otklanjanjem pogrešaka. Ako uzmemo u obzir ovaj način razmišljanja, IlegalArgumentException uvest će nas u naš stog bliže mjestu gdje se čini pogreška.

2.3. Ostali argumenti

Prije nego što prijeđemo na argumente za NullPointerException, pogledajmo nekoliko manjih točaka u korist IlegalArgumentException. Neki programeri smatraju da bi samo JDK trebao bacati NullPointerException. Kao što ćemo vidjeti u sljedećem odjeljku, Javadoc ne podržava ovu teoriju. Drugi je argument da je dosljedniji za upotrebu IlegalArgumentException jer bismo to koristili za druge ilegalne vrijednosti parametara.

3. NullPointerException

Dalje, razmotrimo argumente za NullPointerException.

Stvorimo primjer koji baca a NullPointerException:

public void processSomethingElseNotNull (Object myParameter) {if (myParameter == null) {throw new NullPointerException ("Parametar 'myParameter' ne može biti null"); }}

3.1. Javadoc to kaže kako se koristi

Prema Javadocu za NullPointerException, NullPointerException je namijenjen za upotrebu u pokušaju upotrebe null gdje se traži objekt. Ako parametar naše metode nije namijenjen null, onda bismo to mogli razumno smatrati potrebnim predmetom i baciti NullPointerException.

3.2. U skladu je s JDK API-ima

Uzmimo trenutak da razmislimo o mnogim uobičajenim JDK metodama koje nazivamo tijekom razvoja. Mnogi od njih bacaju NullPointerException ako pružimo a null. Dodatno, Objects.requireNonNull () baca a NullPointerException ako prođemo null. Prema Predmeti dokumentacije, postoji uglavnom za provjeru valjanosti parametara.

Pored JDK metoda koje bacaju NullPointerException, možemo pronaći druge primjere određenih vrsta iznimki koje se izbacuju iz metoda u API-ju zbirki. ArrayList.addAll (indeks, zbirka) baca an IndexOutOfBoundsException ako je indeks izvan veličine popisa i baca a NullPointerException ako je zbirka null. To su dvije vrlo specifične vrste iznimki, a ne one općenitije IlegalArgumentException.

Mogli bismo razmotriti IlegalArgumentException da bi bio namijenjen slučajevima kada nam nije dostupan određeniji tip iznimke.

4. Zaključak

Kao što smo vidjeli u ovom vodiču, ovo je pitanje koje nema jasan odgovor. Čini se da se dokumentacija za dvije iznimke preklapa u tome što kad se uzimaju same, obje zvuče prikladno. Postoje i dodatni uvjerljivi argumenti za obje strane koji se temelje na tome kako programeri rade njihovo uklanjanje pogrešaka i na uzorcima koji se vide u JDK metodama.

Koju god iznimku smo odabrali, trebali bismo biti dosljedni tijekom cijele prijave. Osim toga, svoje iznimke možemo učiniti korisnijima pružanjem značajnih informacija konstruktoru iznimki. Na primjer, naše će aplikacije biti lakše otkloniti pogreške ako u poruci o iznimci pružimo naziv parametra.

Kao i uvijek, primjer koda dostupan je na GitHub-u.