"Gostaria de falar um pouco sobre como as exceções funcionam. O exemplo abaixo deve dar uma ideia aproximada do que acontece:"
class ExceptionExampleOriginal
{
public static void main(String[] args)
{
System.out.println("main begin");
try
{
System.out.println("main before call");
method1();
System.out.println("main after call");
}
catch (RuntimeException e)
{
String s = e.getMessage();
System.out.println(s);
}
System.out.println("main end");
}
public static void method1()
{
System.out.println("method1 begin");
method2();
System.out.println("method1 end");
}
public static void method2()
{
System.out.println("method2");
String s = "Message: Unknown Exception";
throw new RuntimeException(s);
}
}
public class ExceptionExample
{
private static Exception exception = null;
public static void main(String[] args)
{
System.out.println("main begin");
System.out.println("main before call");
method1();
if (exception == null)
{
System.out.println("main after call");
}
else if (exception instanceof RuntimeException)
{
RuntimeException e = (RuntimeException) exception;
exception = null;
String s = e.getMessage();
System.out.println(s);
}
System.out.println("main end");
}
public static void method1()
{
System.out.println("method1 begin");
method2();
if (exception != null) return;
System.out.println("method1 end");
}
public static void method2()
{
System.out.println("method2");
String s = "Message: Unknown Exception";
exception = new RuntimeException(s);
return;
}
}
"Estou totalmente perdido."
"Tudo bem. Deixe-me explicar o que está acontecendo."
"No exemplo à esquerda, chamamos alguns métodos em sucessão. Em method2
, criamos e lançamos uma exceção deliberadamente (criamos um erro)."
"O exemplo à direita mostra o que está acontecendo."
"Veja method2
. Em vez de criar uma exceção, criamos um RuntimeException
objeto, salvamos na variável estática exception
e imediatamente saímos do método usando uma return
instrução."
"Em method1
, depois de chamar method2
, verificamos se há uma exceção. Se houver uma exceção, então method1
termina de uma vez. Uma verificação como essa é realizada indiretamente após cada (!) chamada de método em Java."
"Uau!"
"Uau está certo."
"Na coluna da direita, usei o método main para mostrar aproximadamente o que acontece quando uma exceção é capturada usando uma construção try-catch. Se não houver exceção, tudo continuará funcionando conforme o esperado. Se houver uma exceção e ela é o mesmo tipo especificado na instrução catch, então nós o tratamos."
"O que significa throw
e instanceof
significa? "
"Veja a última linha: throw new RuntimeException(s);
. É assim que você cria e lança uma exceção. Não vamos trabalhar nisso ainda. Foi apenas um exemplo."
"Usamos a instanceof B
para verificar se o objeto a
é do tipo B
, ou seja, se o objeto referenciado pela variável exceção é uma RuntimeException. Esta é uma expressão booleana."
"Acho que consegui. Quase."
GO TO FULL VERSION