2.7.4. Příkaz assert

Během ladění programu se snažíme obvykle na různá místa vkládat kontroly, zda platí určité předem dané podmínky. Například zda se nepokoušíme volat nějakou funkci s nesprávnou hodnotou argumentu. Tyto kontroly pak v okamžiku, kdy jsme zcela přesvědčeni o správnosti svého programu a zajímá nás již jen jeho rychlost, odstraníme nebo v lepším případě převedeme na komentáře. Brzy na to po objevení další chyby testy opět obnovujeme. Lepším řešením je použití relativně nedávno zavedeného příkazu assert, jenž umožňuje do přeloženého programu zařadit kontrolu, zda je splněna podmínka uvedená za klíčovým slovem assert. Pokud tato podmínka splněna není, vyvolá se výjimka AssertionError.

Testovanou podmínku můžeme doplnit po dvojtečce i textovým řetězcem, který se uloží jako popis výjimky. Příkaz assert byl do jazyka Java doplněn až ve verzi 1.4, takže je třeba při překladu zadat parametr -source 1.4. Při spuštění programu se pak v případě, že zadáme parametr -ea, provádí kontrola splnění zadaných podmínek. Pokud tento parametr nezadáme, kontrola podmínek se neprovádí a výpočet se tak ničím nezdržuje.

Příklad 2.6.
Definujte funkci, která vrátí převrácenou hodnotu nenulového čísla. Ošetřete situaci, kdy je jako argument předána nulová hodnota.

S použitím příkazu assert bude řešení včetně testovacího programu následující:

class TestAssert { 
   static double prevracena_hodnota(double x) 
   { 
      assert x != 0.0 : "Argument nesmi byt nulovy"; 
      return 1.0 / x; 
   }    
   public static void main(String args[]) { 
      System.out.println(prevracena_hodnota(1)); 
      System.out.println(prevracena_hodnota(0)); 
   } 
}

Program přeložíme a spustíme posloupností příkazů

javac -source 1.4 TestAssert.java 
java TestAssert 
java -ea TestAssert

Při prvním spuštění není ošetření výjimek zapnuto, takže se dělení nulou provede s výsledkem Infinity (nekonečno), zatímco při druhém spuštění je příkaz assert funkční a výpočet skončí výjimkou AssertionError.

Příkaz assert je vhodné uvádět na těch místech programu, kde potřebujeme zaručit platnost určité podmínky vyplývající přímo z logiky programu. Příkazem assert určitě nebudeme ošetřovat chyby vzniklé činností uživatele, neplatnost uvedené podmínky vždy indikuje chybu v našem programu (nebo chybně stanovenou podmínku, i na to si musíme dát pozor).