5 votes

Pourquoi une variable locale est-elle initiée dans les constructions if-else mais pas dans les constructions if-else-if ?

Nous savons donc qu'une variable locale doit être initialisée afin d'être utilisée dans la construction if-else-if. A titre d'exemple, le code suivant ne compilera pas.

public class Test {
    public static void main (String...args){
      double price= 11;
      String model ;
      if (price>10)
        {model ="smartphone";}
      else if  (price<=11) 
        {model="not smart phone";}
      System.out.println(model);
    }
}

Mais, si vous changez else if (price<=11) a else ou initialiser la variable locale String model à une valeur aléatoire, le code se compilera avec succès. Ma question dans ce cas est "pourquoi ?"

C'était une question tirée d'un livre et l'explication était la suivante :

" la variable locale modèle est seulement déclarée, pas initialisée. L'initialisation du modèle de variable est placée dans les constructions if et else-if. Si vous initialisez une variable à l'intérieur d'une construction if ou else-if, le compilateur ne peut pas être sûr que ces conditions seront évaluées à true, ce qui entraîne l'absence d'initialisation de la variable locale. "

Même après l'explication, je n'ai toujours pas compris deux choses,

  1. Je ne vois pas pourquoi la variable modèle confondrait le compilateur, puisque le double prix est 11 quel que soit le modèle.
  2. Comment fait-on pour initialiser par magie la variable locale quand on met else à la fin ?

11voto

Eran Points 35360

model doit être initialisé avant le System.out.println(model); pour que le code passe la compilation.

  1. Le compilateur n'analyse pas les conditions des instructions if-else-if pour déterminer si l'une d'entre elles sera toujours satisfaite, il ne peut donc pas être sûr que les blocs if ou else-if sont toujours exécutés, et donc il ne peut pas être sûr que model sera initialisé avant la println déclaration.

  2. Lorsque vous utilisez une construction if-else, l'un ou l'autre des blocs if ou else sera exécuté, donc puisque les deux initialisent model il est garanti qu'il sera initialisé avant le lancement de l'opération. println déclaration.

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