Je suis tombé sur le code Java ci-dessous qui a l'air bien au début mais ne compile jamais:
public class UnwelcomeGuest { public static final long GUEST_USER_ID = -1; private static final long USER_ID; static { try { USER_ID = getUserIdFromEnvironment(); } catch (IdUnavailableException e) { USER_ID = GUEST_USER_ID; System.out.println("Logging in as guest"); } } private static long getUserIdFromEnvironment() throws IdUnavailableException { throw new IdUnavailableException(); // Simulate an error } public static void main(String[] args) { System.out.println("User ID: " + USER_ID); } }//Class ends here //User defined Exception class IdUnavailableException extends Exception { IdUnavailableException() { } }//Class ends here
3 Réponses :
Les variables finales permettent au plus une attribution dans le constructeur ou le bloc d'initialisateur. La raison pour laquelle cela ne compile pas, c'est que Java Code Analyzer voit deux affectations à Travailler autour de ce problème est simple: P> user_id code> dans les branches qui ne se lèvent pas mutuellement exclusivement exclusives.
static {
long theId;
try {
theId = getUserIdFromEnvironment();
} catch (IdUnavailableException e) {
theId = GUEST_USER_ID;
System.out.println("Logging in as guest");
}
USER_ID = theId;
}
Mais quel est le problème avec deux missions?
@ Kshitijjain Les variables finales permettent une seule affectation dans le constructeur ou le bloc d'initialisateur.
Mais je m'attendrais à ce que ce compilateur sache que le essaie code> ou le bloc code> code> sera exécuté. Donc, au moment de l'exécution, il ne devrait y avoir que peu d'affectation. Alors pourquoi un tel comportement?
D'accord. J'ai compris. Bonne réponse :)
@Rohit: Vous avez demandé une très bonne question. Quelqu'un peut-il répondre à Rohit?
@Rohitjain Je soupçonne qu'ils prenaient le moyen plus facile de sortir: si l'affectation n'a pas été la dernière instruction dans le bloc code> code>, l'analyseur aurait été juste, car il y aurait une autre possibilité de déclencher une exception.
@Rohitjain, nous ne nous attendrions pas à ce que le compilateur sache que l'essai ou les captures sera exécuté, nous savons qu'il y a un cas dans lequel les deux seront exécutés, et le cas est en réalité l'exception car le VAR est appelé à la mission (Et maintenant, il ne peut plus être appelé pour l'affectation), l'exception est capturée et le Var est ensuite appelé à nouveau pour la création du problème. Le seul moyen de faire cela est d'appeler une seule fois que l'attribution de Dasblinkenglight
Le fait que vous ayez utilisé l'opérateur d'affectation pour jeter l'exception dans la ligne suivante:
USER_ID = getUserIdFromEnvironment();
Puisque le compilateur vous a donné un ce type d'erreur IndicatestHat La variable a été créée (et peut-être changée) ailleurs. Il est bon de changer le nom de votre variable où il apparaît dans votre code. P>