web-dev-qa-db-fra.com

Affectation de variable finale avec try/catch

Parce que je crois que c'est une bonne pratique de programmation, je crée toutes mes variables (locales ou d'instance) final si elles ne doivent être écrites qu'une fois. 

Cependant, je remarque que lorsqu'une affectation de variable peut générer une exception, vous ne pouvez pas rendre ladite 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
}

Y a-t-il un moyen de le faire sans recourir à une variable temporaire? (ou n'est-ce pas le bon endroit pour un dernier modificateur?)

58
dtech

Une façon de faire est d'introduire une variable temporaire (non -final), mais vous avez dit que vous ne vouliez pas le faire.

Une autre méthode 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;
  }
}

Que cela soit 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 peut être de la laisser non -final.

Si, par contre, 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;
  }
}
54
NPE

Non, ce n’est pas le bon endroit. Imaginez que vous ayez plus d’une déclaration dans votre bloc try and catch, la première indique: x = 42. Dire x = 30. Maintenant, vous avez défini x deux fois.

0
SomeJavaGuy