Exceções marcadas e não verificadas em Java
Este tutorial apresenta o que são exceções marcadas e não verificadas em Java.
Em Java, uma exceção é uma situação que ocorre durante a execução do código e termina a execução de forma anormal. Essa exceção pode ocorrer tanto em tempo de compilação quanto em tempo de execução. Java categoriza amplamente a exceção em dois tipos, marcada e desmarcada. A exceção, que é verificada pelo compilador em tempo de compilação, é conhecida como uma exceção verificada. Enquanto isso, uma exceção que é verificada em tempo de execução é chamada de exceção não verificada.
Para lidar com exceções, Java fornece classes para cada exceção, como NullPointerException
, ArrayIndexOutofBoundsException
, IOException
, etc. A classe Exception
está no topo de todas as classes de exceção e qualquer coisa que seja uma subclasse de Exception
Exceto para RuntimeException
e suas subclasses é uma exceção verificada.
As classes de exceção que herdam RuntimeException
como ArithmeticException
, NullPointerException
e ArrayIndexOutOfBoundsException
são chamadas de exceções não verificadas. Eles são verificados em tempo de execução.
Exceções verificadas em Java
Vamos primeiro entender o que é uma exceção e como ela afeta a execução do código. Neste exemplo, estamos gravando dados em um arquivo e este código está sujeito a exceções como FileNotFoundException
, IOException
, etc. Não fornecemos nenhum manipulador de captura e, como essas são exceções verificadas, o compilador Java fornece não compila o código e lança as exceções em tempo de compilação. Veja o exemplo abaixo.
import java.io.FileOutputStream;
public class SimpleTesting {
public static void main(String[] args) {
FileOutputStream fout =
new FileOutputStream("/home/root/eclipse-workspace/java-project/myfile.txt");
fout.write(1256);
fout.close();
System.out.println("Data written successfully");
}
}
Resultado:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Unhandled exception type FileNotFoundException
Unhandled exception type IOException
Unhandled exception type IOException
at SimpleTesting.main(SimpleTesting.java:8)
Para evitar qualquer encerramento anormal do código, devemos fornecer um manipulador catch para o código. Abaixo está o mesmo código acima, mas tem um manipulador catch para que o código não termine no meio e seja executado corretamente. Veja o exemplo abaixo.
import java.io.FileOutputStream;
public class SimpleTesting {
public static void main(String[] args) {
try {
FileOutputStream fout =
new FileOutputStream("/home/irfan/eclipse-workspace/ddddd/myfile.txt");
fout.write(1256);
fout.close();
System.out.println("Data written successfully");
} catch (Exception e) {
System.out.println(e);
}
}
}
Resultado:
Data written successfully
Exceção não verificada em Java
O código a seguir lança ArrayIndexOutOfBoundsException
, que é uma exceção não verificada. Este código é compilado com sucesso, mas não é executado porque estamos acessando elementos fora do intervalo do array; portanto, o código lança uma exceção de tempo de execução. Veja o exemplo abaixo.
public class SimpleTesting {
public static void main(String[] args) {
int[] arr = {3, 5, 4, 2, 3};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
System.out.println(arr[23]);
}
}
Resultado:
3
5
4
2
3
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 23 out of bounds for length 5
at SimpleTesting.main(SimpleTesting.java:9)