Řízení výjimek v Javě - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Java

Řízení výjimek v Javě

java

15. února 2002, 00.00 | Práce s výjimkami je jedna z rutinních potřeb programátora v Javě. Tak proč se na to nepodívat trochu podrobněji.

Narozdíl od mnoha ostatních jazyků, např. Delphi, se v Javě v jistých částech programu „musíte“ ošetřit výjimky, které by zde mohli vzniknout – jinak to nezkompilujete natož spustíte.

V základu existují 3 druhy výjimek: Runtime Exception, Exception a Error. Samozřejmě z těchto základních typů mohou vznikat odvozené typy. V datovém modelu to vypadá asi takto.

objekt Throwable s potomky

Jejich jednotlivý význam je následující. Třída Throwable je příliš obecná, a proto se sní běžně nepracuje. De facto pouze říká, že nastala výjimka, ale již ji blíže nespecifikuje.

Třída Error jsou zase abnormální výjimky, které vznikají ve Virtual Machine např. porušením kódu či častěji nedostatek paměti. Z toho je zřejmé, že tyto výjimky se neošetřují. Obvykle s nimi stejně nemůžeme nic dělat. U příkladu paměti to je vidět názorně. Pro ošetření potřebuje alokovat novou paměť, ta však již došla!? Takže program se ukončí s chybovým výpisem. Tyto výjimky se neošetřují také proto, že nikdy nevíte kde přesně se vyskytnou.

Další třída je Exception jsou výjimky, které se vztahují k určitým metodám, a tudíž zcela přesně víme, kde mohou nastat. Označují se jako synchronní. Kompiler nás nutí je bezprostředně ošetřit. Často se to nesprávně obchází prázdnou deklarací – ošetřením výjimky, ve kterém se nic neudělá. Důvodem bývá ztráta času či odsunutí myšlení od problému. Typickým příkladem jsou I/O Exception, kde je pravděpodobné, že nějaká chyba vznikne.

try 
{
   BufferedReader file = new  BufferedReader(new  FileReader("readme.txt"));
   String  line = file.readLine();
}
catch  (FileNotFoundException e)
{
   System.out.println("File readme.txt not found.");
}
catch  (IOException ioe)
{
   System.out.println("Unable to read data from readme.txt");
}

Z příkladu je vidět, že výjimky se zachytávají přes blok try — catch. Za povšimnutí ještě stojí to, že za jedním try může následovat několik catch, několik výjimek, které by mohli nastat.

Třída RunTime Exception na tyto výjimky lze reagovat a „jednoduše je opravit“ . Jsou označovány jako asynchronní. To proto, že mohou nastat kdekoliv v kódu => není nutno je tedy ošetřovat. Ale doporučil bych je ošetřovat alespoň v místech se zvýšenou pravděpodobností výskytu. Např. při dělení je jistá pravděpodobnost dělení nulou. V extrémním případě je možné ošetřit všechny RunTime Exception, ale pak by byl kód zbytečně nepřehledný a extrémně zdlouhavý ale především pomalý. Způsob ošetření výjimky je naprosto stejný jako u třídy Exception.

try  {
   int n = (int) (Math.random() *10);
   int i = 512 / n;
}
catch  (ArithmeticException e) {
   e.printStackTrace();
}

Nebo to lze bez ošetření.

   int n = (int) (Math.random() *10);
   int i = 512 / n;

Další základní možností je nějaká vlastní odvozená výjimka. Ta se v podstatě může týkat čehokoliv, a tak reakce na ni může být opravdu různorodá.

// soubor NoItemSelectedException.java

public  class  NoItemSelectedException extends  Exception
{
   public  NoItemSelectedException(String  s) // my exception
   {
    super(s);
   }
}

// soubor myException.java
public  class  myException
{
   public  static  String  myArr[] = {"a", "b", "c", "d"};

   public  static  void  showContent(int i)
   {
   try  {
     if  (i < 0) { throw  new  NoItemSelectedException("No item selected."); }
     System.out.println(myArr[i]);
   }
   catch  (NoItemSelectedException e) {
     e.printStackTrace();
   }
   }

   public  static  void  main(String  [] args)
   {
   ...
     showContent(-1);
   ...
   {
}

Zde je uměle vyvolána moje vlastní výjimka v případě, že vybraná položka je nižší než dolní rozsah pole. Samotné vypsání obsahu pole se provede jen tehdy, nebyla-li vyvolána výjimka. Lze to řešit samozřejmě i jinak.

V dalším článku si budeme věnovat způsobům zachycení / předávání a ošetření výjimek.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Java  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: