Pozor na vyhazování vyjímek v Javě v části finally. Pokud vyhodíte vyjímku v části finally, může to překrýt skutečnou příčinu problému.
Příklad
class ExceptionTest { static class Ex0 extends Exception {} static class Ex1 extends Exception {} static class Ex2 extends Exception {} public static void main(String args[]) throws Exception { try { throw new Ex0(); } catch (Exception e) { throw new Ex1(); } finally { throw new Ex2(); } }}
vyhodí vyjímku Ex2.
K napsání tohoto spotu mě inspiroval kolega, který se ptal co udělat v následujícím případě:
void doSomethingWithFile(String filename) { FileReader in = null; try { in = new FileReader(new File(filename)); while ((c = in.read()) != -1) out.write(c); } catch (IOException e) { throw new RuntimeException(e); } finally { if (in != null) { try { in.close(); } catch (IOException) { // ?? what to do with this exception } } }}
Uvědomil jsem si že exception v bloku finally obvykle jen loguju a jinak s ní nic nedělám. Jeho návrh byl tam dát také vyhození vyjímky.
Poradil jsem mu ať tuto exception také jenom zaloguje a novou exception nevyhazuje, protože ta by překryla tu původní, kde může být skutečná příčina.
Jak to řešíte vy?