[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Exceções, interfaces e Java



Segundo a especificação da linguajem Java, seção 8.4.4 (
http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#78323)

8.4.4 - Method Throws

A method that overrides or hides another method (§8.4.6), including
methods that implement abstract methods defined in interfaces, may not
be declared to throw more
checked exceptions than the overridden or hidden method.

More precisely, suppose that B is a class or interface, and A is a
superclass or superinterface of B, and a method declaration n in B
overrides or hides a method declaration m
in A. If n has a throws clause that mentions any checked exception
types, then m must have a throws clause, and for every checked exception
type listed in the throws
clause of n, that same exception class or one of its superclasses must
occur in the throws clause of m; otherwise, a compile-time error occurs.


Na aula falei errado... ;-[

Isto é, parecem não existir restrições ao respeito de "relaxar" as
exceções lançadas na classe implementadora. Ao contrario, SIM está
prohibido lançar MAIS exceções que a interface/superclasse declara no
método em questão.

Segue um exemplo no que se ve que, o mesmo objeto referenciado desde a
classe ou desde a interface, precissa ou não declarar que lança a exeção
(como referência a esse tema, gostei muito do paper referenciado por
Fabio na sua página, referente a Polimorfismo e interfaces).

Abraços,

-- 
 Jorge Francisco Del Teglia   
<PROTECTED>
<PROTECTED>
<PROTECTED>
interface Pulador
{
    void pula() 
        throws java.io.IOException;
}


class C implements Pulador
{
    C()
    {
        System.out.println( "Executing C()..." );
    }

    public void pula()
    {
        System.out.println( "Executing pula()..." );
    }
}

class Tester
{
    public static void main( String[] args )
    {
        // Não lança exceção.
        C umC = new C();
        umC.pula();

        try
        {
            // Pode lançar exceção.
            Pulador pulador = umC;
            pulador.pula();
        }
        catch ( Exception e )
        {
            e.printStackTrace();
        }

    }
}