catch (final Excecao1 | Excecao2 | Excecao3 ... | ExcecaoN ex)
O motivo de se exigir "final" é que a variável ex tem um tipo que é da superclasse de todas as exceções citadas, e essa variável não pode ser alterada, por exemplo, atribuindo-se a ela uma exceção de uma outra classe qualquer. Em vez disso, para simplificar, os projetistas da linguagem escolheram impor que se usasse "final".
import java.security.PublicKey;
import java.security.NoSuchAlgorithmException;
import java.security.InvalidKeyException;
import java.security.NoSuchProviderException;
import java.security.SignatureException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
class TesteExcecoes { // Código pré-Java 7
public static void verify1 () {
Certificate cert = null;
PublicKey key = null;
try {
cert.verify (key);
} catch (CertificateException ex) {
System.out.println ("Certificado inválido");
} catch (NoSuchAlgorithmException ex) {
System.out.println ("Não pode ocorrer");
} catch (InvalidKeyException ex) {
System.out.println ("Erro na chave ou na assinatura");
} catch (NoSuchProviderException ex) {
System.out.println ("Não pode ocorrer");
} catch (SignatureException ex) {
System.out.println ("Erro na chave ou na assinatura");
}
} // Código Java 7 - note o uso de "final" e "|"
public static void verify2 () {
Certificate cert = null;
PublicKey key = null;
try {
cert.verify (key);
} catch (CertificateException ex) {
System.out.println ("Certificado inválido");
} catch (final NoSuchAlgorithmException | NoSuchProviderException ex) {
System.out.println ("Não pode ocorrer");
} catch (final InvalidKeyException | SignatureException ex) {
System.out.println ("Erro na chave ou na assinatura");
}
}
public static void main (String[] args) {
verify1();
verify2();
}
}
Usei o build 95 do Java 7. Pegue o build mais recente, disponível em http://download.java.net/jdk7/ .