Você está na página 1de 10

Tratamento de Exceções em Java

Alberto Paulo Rabelo Barcelos


Iure Guimarães
João Bertolino

Goiânia 3 de abril de 2007


1. Abstract
There are scenarios when our programs have to handle special conditions like an
unrecheable database server over a network. This document approach a very important
branch of programming called exception handling. We begin our study describing a typical
scenario wich is necessary to handle with the exceptions. We keep on understanding the
keywords involved in this field and the java syntax used to describe our problem. After the
study of the “ins and outs” of the syntax we analyse the very dense Java Exception API. By
the moment we have fineshed studying API we are ready to apply these concepts in the real
world.

2. Resumo
Suponha que um erro ocorra enquanto um programa esteja rodando. Estes erros
podem ser causados por uma indisponibilidade da rede, por falta de espaço em disco ou o
término inesperado da conexão de um banco de dados, até mesmo um index inválido para
determinado vetor pode ocasionar um erro uma aplicação.
Os usuários finais esperam que o programa saibam lidar com erros que possam
ocorrer. Quando um erro ocorre em um programa devemos agir de duas formas: retornar a
um estado seguro e permitir o usuário executar uma nova ação ou permitir que o usuário
salve todas as informações e terminar o programa corretamente.

3. Visão Geral
Primeiro tentaremos entender o que é uma exceção e para isso caminharemos pela
definição de alguns termos importantes usando um exemplo.
Imagine um programa que deve abrir uma conexão usando um socket para abrir
um arquivo pela rede. O que acontece quando o servidor no qual você está tentando conectar
pela rede está desligado, não disponível por uma série de razões?
Duas coisas poderão acontecer o programa trava e termina e o usuário terá uma
péssima experiência ou você pode fazer um tratamento de exceção. exceções são condições
excepcionais que você não pode controlar como a indisponibilidade de um servidor.
A responsabilidade do programador é criar um caminho alternativo para a
execução do programa caso a exceção ocorra, evitando assim que o programa termine
inesperadamente e o usário tenha uma péssima experiência.
Noce pode tratar a exceção de várias formas como emitindo uma mensagem ao
usuário dizendo que o servidor esta indisponível e pedindo a ele que selecione um outro
servidor. Dessa forma seu software se torna muito mais confiável e amigável ao usuário final.
Quando o Java encontra uma exceção durante a sua execução dizemos que ele
"lança"(throw) a exceção. Essa condição excepcional lançada pela JVM é tratada como um
objeto. O código do programa tratará a exceção, você será responsável por escrever o código
responsável por lidar com a exceção quando ela ocorrer. Toda vez que uma exceção for
lançada você deve "pegá-la"(patch) com o tratamento da exceção.
Foquemos a partir de agora na sintaxe.

4. Termos

Exceções. Throw. Exception Handling( tratamento de excessões). Erros. Java


5. Sintaxe básica para tratar excessões

Corpo da do código que tratará a exceção:

public class Exception1{


public static void main( String[ ] args){
try{
// Chamada de região protegida("Guarded Region")
// Coloque aqui código que pode lançar uma exceção
}
catch(MinhaPrimeiraExcessao){
// Código que trata a exceção
}
catch(MinhaSegundaExcessao){
// Código que trata a exceção
}
...
...
...
catch(MinhaUltimaExcessao){
// Código que trata a exceção
}
}
}

Todo tipo de método que é chamado lança uma exceção em particular, e a


exceção é um tipo de objeto.
O que ocorre aqui é que o método incia sua execução no bloco "try". A partir do
bloco se uma exceção for lançada ela deve ser tratada pelo bloco "catch". Observe que
podem exister quantos blocos catch quanto quisermos.
Suponha que uma exceção foi lançada pelo blobo "try" a JVM começa a buscar
um bloco "catch" que possa tratar aquela exceção específica. Ela começa na primeira exceção
até chegar a última exceção. Se a exceção lançada não pode ser tratada por nenhum dos
blocos então o método mandará uma mensagem a virtual machine que terminará o programa
inesperadamente.
Em Java dependendo do método que você usa você não pode mesmo compilar
sua classes se você não fizer o tratamento de exceção. O que é uma coisa boa já que evita
transtornos futuros.
Imaginemos agora um exemplo mais real usando pseudo-código.

public class Exception1{


public static void query( ){
try{
Crie um objeto para conexão com o banco de dados
Inicie a conecão com o banco de dados
Crie um objeto para consultar o banco de dados
// Terminará a execução do bloco sem executar os comandos subsequentes
Execute a consulta
Mostre os resultados
Feche a conexão // Clean-up code
}
catch(DatabaseConnectionException){
Escolha outro servidor de banco de dados
Escolha outro banco de dados
Forneça outras credencias de logon
...
// Pode haver centenas de motivos que nos impede de conectar ao
banco de dados
}
catch(QueryException){
// Código que trata a exceção
}
...
...
...
catch(MinhaUltimaExcessao){
// Código que trata a exceção
}
finally{
// Sempre executa
// Coloque aqui seu "Clean-up code"
}
}
}

Suponha que o banco de dados não esteja disponível, imediatamente ao tentar


conectar ao banco de dados o método lançará a exceção e passará a buscar um bloco que
possa tratá-la.
Chegamos ao primeiro bloco catch. Entenda que terminamos a execução do bloco
try antes de executar os outros comandos subsequentes. Dessa forma depois de tratada a
exceção não estaríamos habilitados a terminar a conexão com o banco de dados. Mas
sabemos que sempre devemos liberar nossas fontes para que outros objetos possam usá-
las(consulte threads). Uma fonte("resource") pode ser um stream para um arquivo, uma
conexão com um banco de dados, entre outras. Um pedaço de código que deve liberar uma
"resource" é chama de clean-up code.
No final de nossos blocos podemos colocar o bloco "finally". O código dentro
desse bloco sempre executa não importa o que possa acontecer, ele sempre executa. O fluxo
dentro do método vai do bloco try para o bloco catch apropriado caso seja lançada uma
exceção e depois para o bloco finally que sempre executará mesmo que uma exceção não seja
lançada. Portanto nesse bloco é que devemos colocar nosso clean-up code.

6. Sintaxe básica para gerar uma exceção

String trickyMethod() throws IOException


{
int result = readAnotherChar();
if ( result < 0 ) throw new IOException( "bad data" );
return result;
}
7. A API das excessões

Java é uma linguagem rica em excessões e não poderemos abordar todas aqui. Se
navegarmos pela API de Java podemos ver que dentro de uma package teremos as interfaces,
as classes e as excessões.
Por exemplo consideremos o pacote java.lang temos dentro dele varias interfaces,
classes e excessões que corresponde as principais funcionalidades da linguagem. Esse é o
pacote que encapsula a maioria das funcionalidades básicas de java.
Diferentes excessões são implementadas como classes diferentes, apara citarmos
alguns exemplos: Exception, ArithmeticException, ArrayIndexOutOfBoundsException,
ArrayStoreException, ClassNotFoundException, CloneNotSupportedException,
Exception, IndexOutOfBoundsException, InstantiationException, InterruptedException,
NegativeArraySizeExceptionNoSuchFieldException, NullPointerException
,NumberFormatException, RuntimeException, SecurityException,
StringIndexOutOfBoundsException, UnsupportedOperationException.
Diante de tantos tipos de excessões devemos saber identificar cada tipo de
exceção e usá-las quando em nosso método para lançarmos uma exceção.

8. Estrutura da API
Type codes used in describing Exceptions
Checked?
Letter Type Parent Class Use
(declare throws?)
Error that can occur in almost any code e.g.
R Runtime java.lang.RuntimeException
NullPointerException.
Serious error you really should not try to catch, e.g.
E Error java.lang.Error
OutOfMemoryError.
Likely exceptional condition that can only occur in
C Checked java.lang.Exception
specific places in the code e.g. EOFException.

Specific Exceptions
Exception Name Type Package Notes
AbstractMethodError E java.lang
This is an exception that is thrown whenever a
AccessControlException R java.security reference is made to a non-existent ACL (Access
Control List). notes.
Thrown by certain methods of the java.rmi.Naming
AccessException C java.rmi
class.
Thrown whenever a reference is made to a non-
AclNotFoundException C java.security.acl
existent ACL (Access Control List).
thrown by the RMI runtime when activation fails
ActivateFailedException C java.rmi.activation
during a remote call to an activatable object.
ActivationException C java.rmi.activation
AlreadyBoundException C javax.naming
Used for reporting application level exceptions
ApplicationException C org.omg.CORBA.portable
between ORBs and stubs
ArithmeticException R java.lang Most commonly a divide by zero. notes.
Can be handled more generically with
ArrayIndexOutOfBoundsException R java.lang
IndexOutOfBoundsException. notes.
Thrown to indicate that an attempt has been made to
ArrayStoreException R java.lang store the wrong type of object into an array of
objects. notes.
AttributeInUseException C javax.naming.directory
AttributeModificationException C javax.naming.directory
AuthenticationException C javax.naming
AuthenticationNotSupportedException C javax.naming
AWTError E java.awt
AWTError E java/awt
AWTException C java.awt
This exception is to report bad locations within a
BadLocationException C javax.swing.text
document model.
BatchUpdateException C java.sql
Signals that an error occurred while attempting to
BindException C java.net
bind a socket to a local address and port
CannotProceedException C javax.naming
CannotRedoException R javax.swing.undo
CannotUndoException R javax.swing.undo
CertificateEncodingException C java.security.cert
CertificateException C java.security.cert
CertificateExpiredException C java.security.cert
CertificateNotYetValidException C java.security.cert
CertificateParsingException C java.security.cert
ChangedCharSetException C javax.swing.text
CharConversionException C java.io
ClassCastException R java.lang notes.
ClassCircularityError E java.lang
ClassFormatError E java.lang notes.
ClassNotFoundException C java.lang notes.
CloneNotSupportedException C java.lang
CMMException R java.awt.color
CommunicationException C javax.naming
This exception may be thrown by methods that have
detected concurrent modification of a backing object
ConcurrentModificationException R java.util
when such modification is not permissible. E.g. two
threads modifying a HashMap simultaneously. notes.
ConfigurationException C javax.naming
ConnectException C java.rmi
ConnectIOException C java.rmi
ContextNotEmptyException C javax.naming
CRLException C java.security.cert CRL (Certificate Revocation List) Exception.
DataFormatException C java.util.zip
DigestException C java.security
EmptyStackException R java.util Thrown by methods in the Stack class to indicate that
the stack is empty. Does not refer to the system
Specific Exceptions
Exception Name Type Package Notes
stack.
EOFException C java.io notes.
Catches any serious error such as
Error E java.lang OutOfMemoryError that you unlikely can recover
from.
generic. Catches any specify Exception plus general
Exception C java.lang
Runtime exceptions, but not Errors.
ExceptionInInitializerError E java.lang notes.
ExceptionInInitializerError E java.lang
ExpandVetoException C javax.swing.tree
ExportException C java.rmi.server
FileNotFoundException C java.io
FontFormatException C java.awt
GeneralSecurityException C java.security
IllegalAccessError E java.lang notes.
Thrown when an application tries to load in a class,
but the currently executing method does not have
IllegalAccessException C java.lang access to the definition of the specified class,
because the class is not public and in another
package.
Most common exception to reject a bad parameter to
IllegalArgumentException R java.lang
a method.
IllegalComponentStateException R java.awt
IllegalMonitorStateException R java.lang
IllegalPathStateException R java.awt.geom
Signals that a method has been invoked at an illegal
IllegalStateException R java.lang
or inappropriate time.
IllegalThreadStateException R java.lang
ImagingOpException R java.awt.image
IncompatibleClassChangeError E java.lang notes.
IndexOutOfBoundsException R java.lang
IndirectionException R org.omg.CORBA.portable
InstantiationError E java.lang
InstantiationException C java.lang
InsufficientResourcesException C javax.naming
InternalError E java.lang
Thrown when a thread is waiting, sleeping, or
otherwise paused for a long time and another thread
InterruptedException C java.lang
interrupts it using the interrupt method in class
Thread.
InterruptedIOException C java.io
InterruptedNamingException C javax.naming
IntrospectionException C java.beans
This is a GeneralSecurityException. See
InvalidAlgorithmParameterException C java.security
IllegalArgumentException.
InvalidAttributeIdentifierException C javax.naming.directory
InvalidAttributesException C javax.naming.directory
InvalidAttributeValueException C javax.naming.directory
InvalidClassException C java.io notes.
InvalidDnDOperationException R java.awt.dnd
InvalidKeyException C java.security
InvalidKeySpecException C java.security.spec
InvalidMidiDataException C javax.sound.midi
InvalidNameException C javax.naming
InvalidObjectException C java.io
InvalidParameterException R java.security
InvalidParameterSpecException C java.security.spec
InvalidSearchControlsException C javax.naming.directory
InvalidSearchFilterException C javax.naming.directory
InvalidTransactionException C javax.transaction
InvocationTargetException C java.lang.reflect
IOException C java.io
JarException C java.util.jar
KeyException C java.security
KeyManagementException C java.security
KeyStoreException C java.security
LastOwnerException C java.security.acl
LdapReferralException C javax.naming.ldap
LimitExceededException C javax.naming
LineUnavailableException C javax.sound.sampled
LinkageError E java.lang
LinkException C javax.naming
Specific Exceptions
Exception Name Type Package Notes
LinkLoopException C javax.naming
MalformedLinkException C javax.naming
MalformedURLException C java.net
MarshalException C java.rmi
MidiUnavailableException C javax.sound.midi
MimeTypeParseException C java.awt.datatransfer
MissingResourceException R java.util
NameAlreadyBoundException C javax.naming
NameNotFoundException C javax.naming
NamingException C javax.naming
NamingSecurityException C javax.naming
NegativeArraySizeException R java.lang
NoClassDefFoundError E java.lang notes.
NoInitialContextException C javax.naming
NoninvertibleTransformException C java.awt.geom
NoPermissionException C javax.naming
NoRouteToHostException C java.net
NoSuchAlgorithmException C java.security
NoSuchAttributeException C javax.naming.directory
NoSuchElementException R java.util
NoSuchFieldError E java.lang
NoSuchFieldException C java.lang
NoSuchMethodError E java.lang notes.
NoSuchMethodException C java.lang
NoSuchObjectException C java.rmi
NoSuchProviderException C java.security notes.
Thrown when serialization or deserialization is not
NotActiveException C java.io
active
NotBoundException C java.rmi
NotContextException C javax.naming
NotOwnerException C java.security.acl
NotSerializableException C java.io notes.
NullPointerException R java.lang Actually a null reference exception. notes.
Commonly thrown when a String is converted to
NumberFormatException R java.lang
internal binary numeric format. notes.
ObjectStreamException C java.io
OperationNotSupportedException C javax.naming
Unexpected data appeared in an ObjectInputStream
trying to read an Object. Occurs when the stream
contains primitive data instead of the object that is
OptionalDataException C java.io expected by readObject. The EOF flag in the
exception is true indicating that no more primitive
data is available. The count field contains the number
of bytes available to read.
By the time this happens it is almost too late. gc has
already done what it could. Possibly some process
has just started gobbling RAM, or perhaps the
OutOfMemoryError E java.lang
problem you are trying to solve is just too big for the
size of the allotted virtual ram. You can control that
with the java.exe command line switches.
ParseException C java.text
PartialResultException C javax.naming
PolicyError E org.omg.CORBA
PrinterAbortException C java.awt.print
PrinterException C java.awt.print
PrinterIOException C java.awt.print
PrivilegedActionException C java.security
ProfileDataException R java.awt.color
PropertyVetoException C java.beans
ProtocolException C java.net
ProviderException R java.security
RasterFormatException R java.awt.image
ReferralException C javax.naming
RemarshalException C org.omg.CORBA.portable
RemoteException C java.rmi
RMISecurityException C java.rmi
Error that can occur in almost any code e.g.
NullPointerException. Use this when to catch
RuntimeException R java.lang
general errors when no specific exception is being
thrown.
SchemaViolationException C javax.naming.directory
SecurityException R java.lang
ServerCloneException C java.rmi.server
Specific Exceptions
Exception Name Type Package Notes
ServerError E java.rmi
ServerException C java.rmi
ServerNotActiveException C java.rmi.server
ServerRuntimeException C java.rmi
ServiceUnavailableException C javax.naming
SignatureException C java.security
SizeLimitExceededException C javax.naming
SkeletonMismatchException C java.rmi.server
SkeletonNotFoundException C java.rmi.server
SocketException C java.net
SocketSecurityException C java.rmi.server
SQLException C java.sql
StackOverflowError E java.lang notes.
StreamCorruptedException C java.io ObjectStream data are scrambled. notes.
Can be handled more generically with
StringIndexOutOfBoundsException R java.lang
IndexOutOfBoundsException. notes.
StubNotFoundException C java.rmi
SyncFailedException C java.io
SystemException R org.omg.CORBA
TimeLimitExceededException C javax.naming
TooManyListenersException C java.util
TransactionRequiredException C javax.transaction
TransactionRolledbackException C javax.transaction
UndeclaredThrowableException R java.lang.reflect
UnexpectedException R java.rmi
UnknownError E java.lang
UnknownException R org.omg.CORBA.portable
UnknownGroupException C java.rmi.activation
UnknownHostException C java.rmi
UnknownHostException C java.net
UnknownObjectException C java.rmi.activation
UnknownServiceException C java.net
UnknownUserException C org.omg.CORBA
UnmarshalException C java.rmi notes.
UnrecoverableKeyException C java.security
UnsatisfiedLinkError E java.lang notes.
UnsupportedAudioFileException C javax.sound.sampled
UnsupportedClassVersionError E java.lang notes.
UnsupportedDataTypeException C java.io undocumented. notes.
UnsupportedEncodingException C java.io
UnsupportedFlavorException C java.awt.datatransfer
UnsupportedLookAndFeelException C javax.swing
Use for code not yet implemented, or that you
UnsupportedOperationException R java.lang
deliberately did not implement.
UserException C org.omg.CORBA
UTFDataFormatException C java.io
VerifyError E java.lang notes.
VirtualMachineError E java.lang
WriteAbortedException C java.io
ZipException C java.util.zip notes.
9. Bibliografia
● Core Java vol.2 7ª ed.
● CBT Nuggets. Java: on the job series.
● Thinking in Java 3ª ed.