Exceções...por que compilar / não compila?

Porque este código compila…

[code]public class Example1
{
public Example1()
{
Example1Sub exsub = new Example1Sub();

	try
	{
		exsub.test();
	}
	catch ( Exception e )
	{
		e.printStackTrace();
	}
	
}

void test() throws IOException
{
	System.out.println("In Example1");
	throw new IOException();
}	

}

class Example1Sub extends Example1
{
void test()
{
System.out.println(“In Example1Sub”);
}
}[/code]

e esse não…

[code]public class Example1
{
public Example1()
{
Example1Sub exsub = new Example1Sub();

	try
	{
		exsub.test();
	}
	catch ( IOException e )
	{
		e.printStackTrace();
	}
	
}

void test() throws IOException
{
	System.out.println("In Example1");
	throw new IOException();
}	

}

class Example1Sub extends Example1
{
void test()
{
System.out.println(“In Example1Sub”);
}
}[/code]

Porque o compilador reclama que o corpo do try lança exeção para “IOException” e não reclama para “Exception”?

Na verdade, voce não esta lançando nenhuma excessao neste codigo, pois o metodo .test() chamado é a versao que não lança excessao alguma.

void test() 
 	{
 		System.out.println("In Example1Sub");
 	}

Acontence que no java é permitido colocar um bloco try-catch capturando uma Excption mesmo que nenhuma exceção verificada seja lançada. Pois Exception não soh eh superclasse das excessoes verificadas, como das não verificadas tambem, por exemplo:
o senguinte codigo:

public class NewClass2 {
    

    public NewClass2() {
        try {
            
            System.out.println("");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
}

eh perfeitamente valido.
Contudo, quando voce tenta captar uma exceção VERIFICADA que nunca sera lançada, o compilador reclama.

rodrigo,

scjp1.4