Házet či neházet NullPointerException

Výjimka NullPointerException (zkráceně NPE) je vyhozena runtimem javy ve chvíli, kdy se nad null hodnotou virtuální stroj pokusí vyvolat metodu, přistoupit k prvku nebo u pole k atributu length, případně když se pokusíme o obrat throw null. Dokumentace nabádá k využití této výjimky také v jiných případech špatného použití hodnoty null. Často ale vidím toto:

public xxx(String str) {
  if (str == null) {
    throw new NullPointerException("Cannot be null");
  }
}

V tomto případě je sice všechno v pořádku, ale sémantika NPE je poněkud odlišná, alespoň takhle to chápu já – obvykle vyjadřuje, že je něco opravdu špatně a v podstatě by k ní nemělo vůbec dojít. Jedná se o chybu programátora, když zákazník uvidí tuto výjimku někde v logu nebo přímo v programu (už jste ji také jistě viděli). Může to polekat, nejen uživatele, ale například jiného člena týmu, když výjimku spatří v záznamech JUnitu.

Proto v těchto případech, kdy se kontrolují vstupní parametry metod (velmi dobrý návyk, který je důležitý), bych vyhazoval jednu z výjimek IllegalArgumentException nebo v některých případech IllegalStateException. Jasně dokumentují jen svým názvem, kde se stala chyba a programátor v podstatě ihned začíná tušit, kde hledat.

K vyhození NPE musí být dobrý důvod. Vážný důvod.

Diskuze

If you can't read the letters on the image, download this .wav file to get them read to you.
pridej.cz
blog/hazet_ci_nehazet_nullpointerexception.txt · Poslední úprava: 29.05.2008 09:04 (external edit)
Creative Commons License Valid CSS Driven by DokuWiki Recent changes RSS feed Valid XHTML 1.0