AnyCompiler

Exception Handling

Um try block roda código que pode lançar uma exception; um catch block correspondente a trata se isso acontecer. ArithmeticException aqui é uma unchecked exception — o compilador não exige que você a trate, embora seja boa prática fazê-lo.

public class Main {
    static int divide(int a, int b) {
        return a / b;
    }

    public static void main(String[] args) {
        try {
            System.out.println(divide(10, 2));
            System.out.println(divide(10, 0));
        } catch (ArithmeticException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}
Output
5
Error: / by zero

Checked exceptions: como é um erro real de compilação

Java tem uma segunda categoria sem equivalente nas outras linguagens deste site: checked exceptions. Um method que pode lançar uma, como IOException aqui, tem que capturá-la ou declarar throws IOException na sua própria assinatura — se não fizer nenhum dos dois, o código simplesmente não compila. Isso é genuinamente o que o javac relata — capturado de uma execução real, não escrito para parecer plausível:

import java.io.IOException;

public class Main {
    static void risky() throws IOException {
        throw new IOException("something went wrong");
    }

    public static void main(String[] args) {
        risky();
    }
}
Output
Main.java:9: error: unreported exception IOException; must be caught or declared to be thrown
        risky();
             ^
1 error

risky() declara throws IOException, que é a parte do acordo que cabe ao method — mas main() chama risky() sem capturar essa exception nem declarar seu próprio throws, então o compilador se recusa a compilar. Adicionar try/catch ao redor da chamada, ou throws IOException à própria assinatura de main, resolveria de qualquer uma das duas formas.

A seguir: generics — escrever uma class ou method que funcione com muitos types, com o compilador ainda verificando a segurança de tipos.

Practice exercise

Escreva um method safeDivide(int a, int b) que retorne a / b, mas capture ArithmeticException e retorne 0 se b for 0. Chame-o com (10, 0) e imprima o resultado.