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/ .