Neste tutorial, aprenderemos a usar as palavras-chave throw e throws para tratamento de exceções com a ajuda de exemplos.
Em Java, as exceções podem ser categorizadas em dois tipos:
- Exceções não verificadas: Eles não são verificados em tempo de compilação, mas ao executar-time.For exemplo:
ArithmeticException
,NullPointerException
,ArrayIndexOutOfBoundsException
, excepções previstasError
classe, etc. - Exceções verificadas: elas são verificadas em tempo de compilação. Por exemplo,
IOException
,InterruptedException
, etc.
Consulte Exceções Java para aprender em detalhes sobre exceções marcadas e não verificadas.
Normalmente, não precisamos lidar com exceções não verificadas. É porque exceções não verificadas ocorrem devido a erros de programação. E é uma boa prática corrigi-los em vez de manipulá-los.
Este tutorial agora se concentrará em como lidar com exceções verificadas usando throw
e throws
.
Java throws palavra-chave
Usamos a throws
palavra - chave na declaração do método para declarar o tipo de exceções que podem ocorrer dentro dele.
Sua sintaxe é:
accessModifier returnType methodName() throws ExceptionType1, ExceptionType2… ( // code )
Como você pode ver na sintaxe acima, podemos usar throws
para declarar várias exceções.
Exemplo 1: Java lança palavra-chave
import java.io.*; class Main ( public static void findFile() throws IOException ( // code that may produce IOException File newFile=new File("test.txt"); FileInputStream stream=new FileInputStream(newFile); ) public static void main(String() args) ( try( findFile(); ) catch(IOException e)( System.out.println(e); ) ) )
Resultado
java.io.FileNotFoundException: test.txt (nenhum arquivo ou diretório)
Quando executamos este programa, se o arquivo test.txt
não existe, FileInputStream
lança um FileNotFoundException
que estende a IOException
classe.
Se um método não manipular exceções, o tipo de exceções que podem ocorrer dentro dele deve ser especificado na throws
cláusula para que os métodos mais acima na pilha de chamadas possam manipulá-los ou especificá-los usando as throws
próprias palavras-chave.
O findFile()
método especifica que um IOException
pode ser lançado. O main()
método chama esse método e trata a exceção se ela for lançada.
Lançando várias exceções
Veja como podemos lançar várias exceções usando a throws
palavra - chave.
import java.io.*; class Main ( public static void findFile() throws NullPointerException, IOException, InvalidClassException ( // code that may produce NullPointerException… … … // code that may produce IOException… … … // code that may produce InvalidClassException… … … ) public static void main(String() args) ( try( findFile(); ) catch(IOException e1)( System.out.println(e1.getMessage()); ) catch(InvalidClassException e2)( System.out.println(e2.getMessage()); ) ) )
Aqui, o findFile()
método especifica que ele pode jogar NullPointerException
, IOException
e, InvalidClassException
em sua throws
cláusula.
Observe que não tratamos do NullPointerException
. Isso ocorre porque é uma exceção não verificada. Não é necessário especificá-lo na throws
cláusula e tratá-lo.
lança Vs palavra-chave. tente … pegue … finalmente
Pode haver vários métodos que podem causar exceções. Escrever try… catch
para cada método será tedioso e o código se tornará longo e menos legível.
throws
também é útil quando você verificou a exceção (uma exceção que deve ser tratada) que não deseja capturar no método atual.
Java throw palavra-chave
A throw
palavra-chave é usada para lançar explicitamente uma única exceção.
Quando uma exceção é lançada, o fluxo de execução do programa é transferido de um try
bloco para outro catch
. Usamos a throw
palavra - chave dentro de um método.
Sua sintaxe é:
throw throwableObject;
Um objeto que pode ser jogado é uma instância de classe Throwable
ou subclasse da Throwable
classe.
Exemplo 2: Java throw palavra-chave
class Main ( public static void divideByZero() ( throw new ArithmeticException("Trying to divide by 0"); ) public static void main(String() args) ( divideByZero(); ) )
Resultado
Exceção no thread "main" java.lang.ArithmeticException: Tentando dividir por 0 em Main.divideByZero (Main.java:3) em Main.main (Main.java:7) status de saída 1
Neste exemplo, estamos jogando explicitamente um ArithmeticException.
Nota: ArithmeticException
é uma exceção não verificada. Geralmente não é necessário lidar com exceções não verificadas.
Exemplo 3: lançando exceção verificada
import java.io.*; class Main ( public static void findFile() throws IOException ( throw new IOException("File not found"); ) public static void main(String() args) ( try ( findFile(); System.out.println("Rest of code in try block"); ) catch (IOException e) ( System.out.println(e.getMessage()); ) ) )
Resultado
Arquivo não encontrado
O findFile()
método lança um IOException
com a mensagem que passamos para seu construtor.
Observe que, como é uma exceção verificada, devemos especificá-la na throws
cláusula.
Os métodos que chamam esse findFile()
método precisam tratar essa exceção ou especificá-la usando a throws
própria palavra-chave.
Tratamos essa exceção no main
()
método. O fluxo de execução do programa é transferido de try
bloco para catch
bloco quando uma exceção é lançada. Portanto, o resto do código no try
bloco é ignorado e as instruções no catch
bloco são executadas.