web-dev-qa-db-fra.com

Décodage d'URL: UnsupportedEncodingException dans Java

Ce que je comprends de la documentation, c'est que nsupportedEncodingException ne peut être levé que si je spécifie un mauvais codage comme deuxième paramètre de la méthode URLDecoder.decode (String, String). En est-il ainsi? J'ai besoin de connaître les cas où cette exception peut être levée.

Fondamentalement, j'ai ce segment de code dans l'une de mes fonctions:

if (keyVal.length == 2) {
    try {
        value = URLDecoder.decode(
            keyVal[1],
            "UTF-8");
    } catch (UnsupportedEncodingException e) {
          // Will it ever be thrown?
    }
}

Puisque je mentionne explicitement "UTF-8", y a-t-il un moyen de lever cette exception? Dois-je faire quelque chose dans le bloc catch? Ou, si ma compréhension est complètement fausse, faites-le moi savoir.

49
Hari Menon

Cela ne peut pas arriver, sauf s'il y a quelque chose de fondamentalement cassé dans votre JVM. Mais je pense que vous devriez écrire ceci comme:

try {
    value = URLDecoder.decode(keyVal[1], "UTF-8");
} catch (UnsupportedEncodingException e) {
    throw new AssertionError("UTF-8 is unknown");
    // or 'throw new AssertionError("Impossible things are happening today. " +
    //                              "Consider buying a lottery ticket!!");'
}

Le coût de cette opération est de quelques octets de code qui ne seront "jamais" exécutés et d'un littéral String qui ne sera jamais utilisé. C'est un petit prix pour la protection contre la possibilité que vous ayez mal lu/mal compris les javadocs (vous ne l'avez pas dans ce cas ...) ou que les spécifications puissent changer (ce ne sera pas le cas dans ce cas ...)

51
Stephen C

C'est à cause du choix étrange de faire vérifier UnsupportedEncodingException. Non, il ne sera pas jeté.

Je fais généralement comme suit:

} catch (UnsupportedEncodingException e) {
  throw new AssertionError("UTF-8 not supported");
}
14
Bozho

Dans votre cas particulier - non, il ne sera pas jeté. Sauf si vous exécutez votre code dans un runtime Java qui ne prend pas en charge "UTF-8").

5
Andreas_D