Pokud jste se již naučili mechanismus výjimek, pochopili jejich účel, generování a zpracování (odchytání), zkuste se podívat na výjimky, které jsou v Javě standardně obsažené.

Těch je poměrně velké množství (120 až 180 podle verze JDK), se všemi se však běžně nesetkáme. Mnoho jich totiž generuje jedna standardní třída Javy, aby je jiná standardní třída zpracovala a k běžnému programátorovi se tak vůbec nedostanou. Uděláme si přehled těch častých, s nimiž se při programování pravděpodobně budete setkávat.

java.lang.Exception – předchůdce všech výjimek. Pokud chcete odchytit všechny výjimky a nereagovat speciálním způsobem na konkrétní problém, stačí napsat:

try {
   … // kód generující výjimku
   } catch (Exception e) {
      System.out.println(„Nastala vyjimka: „+e.toString());
   }

java.lang.ArithmeticException – výjimka při aritmetických výpočtech. Tato výjimka nastává například při dělení nulou.

java.lang.ArrayIndexOutOfBoundsException – přístup k položce pole s neexitujícím indexem. Tato výjimka nastane například v následujícím kódu:

Object x[] = new String[2];
x[0] = „Ahoj“;
x[1] = „Nazdar“;
x[2] = „Cau“ // vyvolá výjimku ArrayIndexOutOfBoundsException

java.lang.ClassCastException – výjimka je vyvolána v případě přetypování objektu na podtyp třídy, jejíž není instance. Přetypování na typ Object a zpět se v Javě používá poměrně často, například při ukládání objektů do seznamu. Následující kód vyvolá výjimku ClassCastException:

Object x = new Integer(0);
System.out.println((String)x);

java.lang.IndexOutOfBoundsException – indikuje, že index (v poli, v řetězci či ve vektoru) je mimo povolený rozsah. Tato třída má podtřídy ArrayIndexOutOfBoundsException a StringIndexOutOfBoundsException.

java.lang.NegativeArraySizeException – výjimka vznikne, pokud se program pokusí vytvořit pole se zápornou velikostí.

java.lang.NullPointerException – toto je velmi obvyklá výjimka, která nastává při práci s proměnnou, která obsahuje hodnotu null. Aplikace samy mohou a měly by generovat tuto výjimku ve vlastních metodách, pokud je jim chybně předán parametr s hodnotou null. Natává v těchto případech:

  • volání metody null-ového objektu
  • přístup k proměnné null-ového objektu
  • zjištění délky pole nebo přístup k poli, které má hodnotu null
  • vyhození hodnoty null v proměnné typu Throwable místo konkrétní výjimky

java.lang.NumberFormatException – výjimka indikuje pokus o převod řetězce na některý číselný typ v případě, že řetězec nemá patřičný typ. Příklad použití:

String vstupniRetezec = nactiVstup();
try {
   long cislo = Long.parseLong(args[0]);
   }
   catch (NumberFormatException e) {
      System.out.println(„Zadaný vstup nebyl celé číslo!“);
   }

java.lang.RuntimeException – tato výjimka je nadtřídou všech výjimek, které mohou nastat při běžném kroku Virtuálního stroje (JVM) a není nutné ji v programu odchytávat. Její podtřídy z uvedených výjimek jsou například ArithmeticException, IndexOutOfBoundsException, NegativeArraySizeException nebo NullPointerException.

java.lang.StringIndexOutOfBoundsException – výjimka indikuje přístup ke znaku řetězce (metoda String.charAt()) s neexistujícím indexem.

java.io.EOFException – nastává při pokusu o čtení za koncem souboru či jiného vstupního proudu.

java.io.FileNotFoundException – nastává při pokusu otevřít soubor s neexitujícím jménem.

java.io.IOException – výjimka, která je nadtřídou všech výjimek souvisejících se vstupy a výstupy (například FileNotFoundException nebo EOFException).

java.io.InterruptedIOException – signalizuje, že vstupně-výstupní operace byla přerušena.

java.netSocketException – signalizuje chybu při komunikaci přes TCP sockety (například selhání připojení). Tato třída je nadtřídou pro třídy BindException, ConnectException a NoRouteToHostException, které odpovídají konkrétním chybám při navazování komunikace.

java.net.MalformedURLException – výjimka nastává v případě, že zadaná URL adresa má chybný formát. Například může být zadán neexistující protokol nebo adresa ve špatném formátu.

java.lang.NoSuchElementException – tuto výjimku vyvolává metoda nextElement() v případě, že již neexistuje další požadovaný element objektu Enumeration. Tento objekt se používá pro sekvenční přístup k položkám seznamu.

Výjimky se musí odchytávat

Několikrát už bylo zmíněno, že výjimky, které nejsou potomky tříd Error nebo RuntimeException je v Javě třeba odchytávat. Co to ale znamená? Co když je neodchytíme a jak se vlastně dozvíme, že je máme odchytávat?

Fakt, že daný příkaz může určitou výjimku způsobit, se dozvíme v dokumentaci Javy u daného příkazu. Jedná-li se o naši vlastní třídu, musíme to prostě vědět. Když tuto výjimku neošetříme, kompilátor Javy nepovolí kompilaci třídy a ohlásí chybu – neošetřenou výjimku (dozvíte se kterou výjimku a kde).

1 Příspěvěk v diskuzi

  1. nepochopil jsem:java.lang.ArrayIndexOutOfBoundsException
    pise mi to kdyz chci odeslat sms z mobilu pres internet zadarmo a pise mi to „java.lang.ArrayIndexOutOfBoundsException – 0“ jak to mám opravit a co to vlastně znamená?
    jde to opravit nebo mám zkusit přeinstalovat aplikaci?

Odpovědět