Java: Tratamento de Exceções Alcides Calsavara 1 Definição Exceções são acontencimentos fora do comportamento normal ou desejado para um programa. O gerenciamento de exeções permite o controle sobre erros e possivelmente uma solução de contorno. Exemplos: entrada em formato inválido, arquivo corrompido, conexão de rede não disponível, índice inválido para vetor, ... 2 Exemplo de código frágil class TestNullP { static String s = null; public static void main(String args[ ]) { char c1 = s.charAt(2); // java.lang.NullPointerException (programa pára) s = new String("Curitiba"); char c2 = s.charAt(2); // c2 = 'r' char c3 = s.charAt(8); // java.lang.StringIndexOutOfBoundsException (programa pára) } } // fim 3 Exemplo modificado com ifs class TestNullP { static String s = null; public static void main(String args[ ]) { if (s != null && s.length( ) > 2) char c1 = s.charAt(2); s = new String("Curitiba"); if (s != null && s.length( ) > 2) char c2 = s.charAt(2); // c2 = 'r' if (s != null && s.length( ) > 8) char c3 = s.charAt(8); } } // fim 4 Exemplo modificado com tratamento de exceções class TestNullP { static String s = null; public static void main(String args[]) { try { char c1 = s.charAt(2); } catch (Exception e) { System.out.println("Exceção " + e); // Exceção: java.lang.NullPointerException } // continua 5 Exemplo modificado com tratamento de exceções (cont.) s = new String("Curitiba"); try { char c2 = s.charAt(2); // c2 = 'r' } catch (Exception e) { System.out.println("Exceção " + e); } // continua 6 Exemplo modificado com tratamento de exceções (cont.) try { char c3 = s.charAt(8); } catch (Exception e) { System.out.println("Exceção " + e); // Exceção: java.lang.StringIndexOutOfBoundsException } } } // fim 7 Hierarquia de exceções Throwable Error Exception ... RuntimeException IOException ... ... ... 8 Tratando exceções não relacionadas por herança class TestNullP { static String s = null; public static void main(String args[ ]) { try { char c1 = s.charAt(2); } catch (Exception e) { System.out.println("Exceção " + e); } catch (Error e) { System.out.println("Erro " + e); } } // fim 9 A cláusula finally class TestNullP { static String s = null; public static void main(String args[ ]) { try { char c1 = s.charAt(2); } catch (Exception e) { System.out.println("Exceção " + e); } catch (Error e) { System.out.println("Erro " + e); } finally { System.out.println("Adios, amigos"); } // executado sempre } } 10 A cláusula throws class TestNullP { static String s = null; static void work( ) throws Throwable { try { char c1 = s.charAt(2); } catch (Exception e) { System.out.println("Exceção"); throw(e); } catch (Error e) { System.out.println("Erro"); throw(e); } finally { System.out.println("Adios, amigos");} } // continua 11 A cláusula throws (cont.) public static void main(String args[ ]) { try { work( ); } catch(Throwable t) { System.out.println("Erro ou Exceção " + t); } finally { System.out.println("Adios, amigos II");} } } // fim 12 Definindo suas próprias exceções class ProblemaEmWork extends Exception { public ProblemaEmWork( ) { } public ProblemaEmWork(String msg) { super(msg); } } // continua 13 Definindo suas próprias exceções (cont.) class TestNullP { static String s = null; static void work( ) throws ProblemaEmWork { try { char c1 = s.charAt(2); } catch (Exception e) { throw(new ProblemaEmWork("Exceção em work " + e)); } catch (Error e) { throw(new ProblemaEmWork("Erro em work " + e)); } finally { System.out.println("Adios, amigos");} } // continua 14 Definindo suas próprias exceções (cont.) public static void main(String args[ ]) { try { work(); } catch(ProblemaEmWork p) { System.out.println(p); } finally { System.out.println("Adios, amigos II");} } } // fim 15