Exceções comuns em Java
1. Introdução
Este tutorial se concentra em algumas exceções comuns do Java.
Começaremos discutindo o que basicamente é uma exceção. Posteriormente, discutiremos os diferentes tipos de exceções verificadas e não verificadas em detalhes.
2. Exceções
An exception is an abnormal condition that occurs in a code sequence during the execution of a program. Esta condição anormal surge quando um programa viola certas restrições em tempo de execução.
Todos os tipos de exceção são subclasses da classeException. Essa classe é subclassificada em exceções verificadas e não desmarcadas. Vamos considerá-los em detalhes nas seções subsequentes.
3. Exceções verificadas
Checked exceptions are mandatory to handle. Eles são subclasses diretas da classeException.
Há umdebate em sua importância que vale a pena dar uma olhada.
Vamos definir algumas exceções verificadas em detalhes.
3.1. IOException
Um método lança umIOException ou uma subclasse direta dele quando qualquer operação de entrada / saída falha.
Os usos típicos dessas operações de E / S incluem:
-
Trabalhando com o sistema de arquivos ou fluxos de dados usando o pacotejava.io
-
Criação de aplicativos de rede usando o pacotejava.net
FileNotFoundException
FileNotFoundException é um tipo comum deIOException ao trabalhar com o sistema de arquivos:
try {
new FileReader(new File("/invalid/file/location"));
} catch (FileNotFoundException e) {
LOGGER.info("FileNotFoundException caught!");
}
MalformedURLException
Ao trabalhar com URLs, podemos encontrarMalformedURLException – se nossos URLs forem inválidos.
try {
new URL("malformedurl");
} catch (MalformedURLException e) {
LOGGER.error("MalformedURLException caught!");
}
3.2. ParseException
Java usa análise de texto para criar um objeto com base em um determinadoString.If parsing causes an error, it throws a ParseException.
Por exemplo, podemos representarDate de maneiras diferentes, por exemplo dd/mm/yyyy oudd,mm,yyyy,, mas tente analisar astring com um formato diferente:
try {
new SimpleDateFormat("MM, dd, yyyy").parse("invalid-date");
} catch (ParseException e) {
LOGGER.error("ParseException caught!");
}
Aqui,String está malformado e causa umParseException.
3.3. InterruptedException
Sempre que um encadeamento Java chamajoin(), sleep() ouwait(), ele vai para o estadoWAITING ou para o estadoTIMED_WAITING.
Além disso, um encadeamento pode interromper outro encadeamento chamando o métodointerrupt() de outro encadeamento.
Consequentemente,the thread throws an InterruptedException if another thread interrupts it while it is in the WAITING or in the TIMED_WAITING state.
Considere o seguinte exemplo com dois threads:
-
O segmento principal inicia o segmento filho e o interrompe
-
O thread filho inicia e chamasleep()
Este cenário resulta em umInterruptedException:
class ChildThread extends Thread {
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
LOGGER.error("InterruptedException caught!");
}
}
}
public class MainThread {
public static void main(String[] args)
throws InterruptedException {
ChildThread childThread = new ChildThread();
childThread.start();
childThread.interrupt();
}
}
4. Exceções não verificadas
For Unchecked Exceptions, the compiler doesn’t check during the compilation process. Portanto, não é obrigatório para o método lidar com essas exceções.
Todas as exceções não verificadas estendem a classeRuntimeException.
Vamos discutir algumas exceções não verificadas em detalhes.
4.1. NullPointerException
Se um aplicativo tentar usarnull onde realmente requer uma instância de objeto, o método lançará umNullPointerException.
Existem diferentes cenários onde o uso ilegal denull causaNullPointerException.. Vamos considerar alguns deles.
Chamando um método da classe que não possui instância de objeto:
String strObj = null;
strObj.equals("Hello World"); // throws NullPointerException.
Além disso, se um aplicativo tenta acessar ou modificar uma variável de instância com uma referêncianull, obtemos umNullPointerException:
Person personObj = null;
String name = personObj.personName; // Accessing the field of a null object
personObj.personName = "Jon Doe"; // Modifying the field of a null object
4.2. ArrayIndexOutOfBoundsException
Uma matriz armazena seus elementos de maneira contígua. Assim, podemos acessar seus elementos através de índices.
No entanto, if a piece of code tries to access an illegal index of an array, the respective method throws an ArrayIndexOutOfBoundException.
Vejamos alguns exemplos que geramArrayIndexOutOfBoundException:
int[] nums = new int[] {1, 2, 3};
int numFromNegativeIndex = nums[-1]; // Trying to access at negative index
int numFromGreaterIndex = nums[4]; // Trying to access at greater index
int numFromLengthIndex = nums[3]; // Trying to access at index equal to size of the array
4.3. StringIndexOutOfBoundsException
A classeString em Java fornece os métodos para acessar um caractere específico da string ou para cortar uma matriz de caracteres deString.. Quando usamos esses métodos, ela converte internamente oString em uma matriz de caracteres.
Novamente, pode haver um uso ilegal de índices nessa matriz. Nesses casos, esses métodos da classeString geramStringIndexOutOfBoundsException.
Essa exceçãoindicates that the index is either greater than or equal to the size of the String. StringIndexOutOfBoundsException estendeIndexOutOfBoundsException.
O métodocharAt(index) da classeString lança esta exceção quando tentamos acessar um caractere no índice igual ao comprimento deString’s ou algum outro índice ilegal:
String str = "Hello World";
char charAtNegativeIndex = str.charAt(-1); // Trying to access at negative index
char charAtLengthIndex = str.charAt(11); // Trying to access at index equal to size of the string
4.4. NumberFormatException
Muitas vezes, um aplicativo termina com dados numéricos emString. Para interpretar esses dados como numéricos, Java permite a conversão deString em tipos numéricos. As classes de wrapper, comoInteger, Float, etc., contêm métodos utilitários para esse propósito.
No entanto,if the String doesn’t have an appropriate format during the conversion, the method throws a NumberFormatException.
Vamos considerar o seguinte snippet.
Aqui, declaramos aString com dados alfanuméricos. Além disso, tentamos usar os métodos da classe de wrapperInteger para interpretar esses dados como numéricos.
Consequentemente, isso resulta emNumberFormatException:
String str = "100ABCD";
int x = Integer.parseInt(str); // Throws NumberFormatException
int y = Integer.valueOf(str); //Throws NumberFormatException
4.5. ArithmeticException
When a program evaluates an arithmetic operation and it results in some exceptional condition, it throws ArithmeticException. Além disso,ArithmeticException se aplica apenas a tipos de dadosint andlong.
Por exemplo, se tentarmos dividir um inteiro por zero, obtemos umArithmeticException:
int illegalOperation = 30/0; // Throws ArithmeticException
4.6. ClassCastException
Java permitetypecasting entre os objetos para oferecer suporte a herança e polimorfismo. Podemos upcast um objeto ou downcast.
Na upcasting, lançamos um objeto para seu supertipo. E no downcasting, lançamos um objeto em um de seus subtipos.
No entanto,at runtime, if the code attempts to downcast an object to a subtype of which it isn’t an instance, the method throws a ClassCastException.
A instância de tempo de execução é o que realmente importa na conversão de tipo. Considere a seguinte herança entreAnimal,Dog, and Lion:
class Animal {}
class Dog extends Animal {}
class Lion extends Animal {}
Além disso, na classe do driver, lançamos a referênciaAnimal contendo uma instância deLion em aDog.
No entanto, no tempo de execução, a JVM percebe que a instânciaLion não é compatível com o subtipo da classeDog.
Isso resulta emClassCastException:
Animal animal = new Lion(); // At runtime the instance is Lion
Dog tommy = (Dog) animal; // Throws ClassCastException
4.7. IllegalArgumentException
Um método lança umIllegalArgumentException se o chamarmos com alguns argumentos ilegais ou inadequados.
Por exemplo, o métodosleep() da classeThread espera um tempo positivo e passamos um intervalo de tempo negativo como argumento. Isso resulta emIllegalArgumentException:
Thread.currentThread().sleep(-10000); // Throws IllegalArgumentException
4.8. IllegalStateException
IllegalStateException sinaliza que um método foi invocado em um momento ilegal ou impróprio.
Todo objeto Java possui um estado (variáveis de instância) e algum comportamento (métodos). Assim,IllegalStateException significa que é ilegal invocar o comportamento deste objeto com as variáveis de estado atuais.
No entanto, com algumas variáveis de estado diferentes, pode ser legal.
Por exemplo, usamos um iterador para iterar uma lista. Sempre que inicializamos um, ele define internamente sua variável de estadolastRet como -1.
Com este contexto, o programa tenta chamar o métodoremove da lista:
//Initialized with index at -1
Iterator intListIterator = new ArrayList<>().iterator();
intListIterator.remove(); // IllegalStateException
Internamente, o métodoremove verifica a variável de estadolastRet e se for menor que 0, ele lançaIllegalStateException. Aqui, a variável ainda está apontando para o valor -1.
Como resultado, obtemos umIllegalStateException.
5. Conclusão
Neste artigo, discutimos primeiro o que são exceções. Umexception é um evento, que ocorre durante a execução de um programa, que interrompe o fluxo normal das instruções do programa.
Em seguida, categorizamos as exceções em Exceções verificadas e Exceções não verificadas.
Em seguida, discutimos diferentes tipos de exceções que podem surgir durante o tempo de compilação ou no tempo de execução.
Podemos encontrar o código deste artigoover on GitHub.