Funções em Java: usando o try catch
Ao executar um código java, podem ocorrer erros e um erro pode parar a execução da aplicação. Para evitar que a aplicação pare, é utilizado o bloco try catch para fazer o tratamento de exceções.
O bloco try(tentar) tenta executar um código e caso ocorra uma exceção, o catch(pegar), a captura e faz o tratamento dela.
Após uma exceção ter alcançado o bloco catch, o código volta ao fluxo normal de execução para fora do try catch.
A sintaxe do try catch é a seguinte:
try {
bloco de código
} catch(Exception e) {
bloco para tratar o erro
}
Abaixo segue um exemplo onde são declaradas três variáveis, a = 10, b = 0 e c recebe o resultado da divisão entre a e b. Tentar dividir um valor por zero gera a exceção "ArithmeticException" e por isso a atribuição do resultado para a variável c foi colocada dentro do bloco try.
public class TryCatch {
public static void main(String[] args) {
int a = 10;
int b = 0;
int c;
try {
c = a / b;
System.out.println(c);
} catch(ArithmeticException e) {
System.out.println("Algo deu errado: " + e.getMessage());
e.printStackTrace();
}
System.out.println("Texto impresso após o tratamento da exceção.");
}
}
O método "getMessage()" retorna uma String com o detalhe da mensagem do erro.
O método "printStackTrace()" imprime o rastreamento da pilha para identificarmos onde ocorreu o erro.
Ao executarmos esse código, temos a seguinte saída:
Algo deu errado: / by zero
java.lang.ArithmeticException: / by zero
at TryCatch.main(TryCatch.java:8)
Código executado após o tratamento da exceção.
É possível colocar mais de um bloco catch para capturar outros tipos de exceções. Utilizando o exemplo anterior, foi declarado um array e iniciado com três posições e no bloco try, ao tentar acessar uma posição maior que o tamanho total do array é gerada a exceção "ArrayIndexOutOfBoundsException".
public class TryCatch {
public static void main(String[] args) {
int a = 10;
int b = 2;
int c;
int[] numeros = {11, 12, 7};
try {
c = a / b;
System.out.println(c);
System.out.println(numeros[3]);
} catch(ArithmeticException e) {
System.out.println("Algo deu errado: " + e.getMessage());
e.printStackTrace();
} catch(ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
System.out.println("Texto impresso após o tratamento da exceção.");
}
}
A saída desse exemplo informa que o índice acessado está fora dos limites do tamanho do array:
5
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at TryCatch.main(TryCatch.java:12)
Código executado após o tratamento da exceção.
Ao colocar dois ou mais blocos catch apenas um será executado, mesmo que haja outros depois dele.
Ainda existe a possibilidade de usar o Multi-Catch que permite capturar mais de uma exceção em apenas um bloco catch. Ele é utilizado quando o tratamento é o mesmo para todas as exceções, como por exemplo, imprimir o rastreamento da pilha de exceção. Para usar o Multi-Catch, é colocado os nomes das classes separados pelo caractere pipe "|" conforme o exemplo abaixo.
public class TryCatch {
public static void main(String[] args) {
int a = 10;
int b = 0;
int c;
int[] numeros = {11, 12, 7};
try {
c = a / b;
System.out.println(c);
System.out.println(numeros[3]);
} catch(ArithmeticException | ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
System.out.println("Texto impresso após o tratamento da exceção.");
}
}
Saída do exemplo acima:
java.lang.ArithmeticException: / by zero
at TryCatch.main(TryCatch.java:9)
Texto impresso após o tratamento da exceção.
Quando ocorrer uma exceção e ainda existir a necessidade de executar um código, é possível usar o bloco finally. Sua sintaxe é:
try {
bloco de código
} catch(Exception e) {
bloco para tratar o erro
} finally {
bloco de código
}
Também é possível usar o finally sem o bloco catch:
try {
bloco de código
} finally {
bloco de código
}
Exemplo de sua execução:
public class TryCatch {
public static void main(String[] args) {
int a = 10;
int b = 0;
int c;
int[] numeros = {11, 12, 7};
try {
c = a / b;
System.out.println(c);
System.out.println(numeros[3]);
} catch(ArithmeticException | ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
} finally {
System.out.println("O bloco finally é executado mesmo ocorrendo uma exceção.");
}
}
}
Saída:
java.lang.ArithmeticException: / by zero
at TryCatch.main(TryCatch.java:9)
O bloco finally é executado mesmo ocorrendo uma exceção.
Conclusão
Usar try catch torna sua aplicação mais robusta e menos suscetível a falhas, quando estas são identificadas e tratadas adequadamente.
Para mais informações, consulte: https://docs.oracle.com/javase/tutorial/essential/exceptions/try.html