84 votes

Affectation de variables finales avec try/catch

Parce que je crois que c'est une bonne pratique de programmation, je fais en sorte que toutes mes variables (locales ou d'instance) soient final s'ils sont destinés à n'être écrits qu'une seule fois.

Cependant, je remarque que lorsqu'une assignation de variable peut lever une exception, vous ne pouvez pas rendre cette variable finale :

final int x;
try {
    x = Integer.parseInt("someinput");
}
catch(NumberFormatException e) {
    x = 42;  // Compiler error: The final local variable x may already have been assigned
}

Existe-t-il un moyen d'y parvenir sans avoir recours à une variable temporaire ? (ou est-ce que ce n'est pas le bon endroit pour un modificateur final ?)

75voto

NPE Points 169956

Une façon d'y parvenir est d'introduire un élément (non final ), mais vous avez dit que vous ne vouliez pas le faire.

Une autre solution consiste à déplacer les deux branches du code dans une fonction :

final int x = getValue();

private int getValue() {
  try {
    return Integer.parseInt("someinput");
  }
  catch(NumberFormatException e) {
    return 42;
  }
}

La question de savoir si cela est pratique ou non dépend du cas d'utilisation exact.

Dans l'ensemble, tant que x est une variable locale à portée appropriée, l'approche générale la plus pratique pourrait consister à la laisser non final .

Si, en revanche, le x est une variable membre, mon conseil serait d'utiliser une variable non final temporaire lors de l'initialisation :

public class C {
  private final int x;
  public C() {
    int x_val;
    try {
      x_val = Integer.parseInt("someinput");
    }
    catch(NumberFormatException e) {
      x_val = 42;
    }
    this.x = x_val;
  }
}

-1voto

SomeJavaGuy Points 6629

Non, ce n'est pas le bon endroit, imaginez que vous ayez plus d'une déclaration dans votre bloc d'essai et de capture, la première dit : x = 42. Après quelques autres déclarations, le bloc try échoue, et on passe au bloc catch, où l'on dit x = 30. Vous avez donc défini x deux fois.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X