27 votes

derniers caractères en Java

Le segment de code suivant émet une erreur de compilation.

char c = 'c';
char d = c + 5;

L'erreur sur la deuxième ligne, dit,

possible loss of precision
  required: char
  found:    int

Le message d'erreur est basé sur l'EDI NetBeans.


Ce caractère, c est déclarée final comme suit.

final char c = 'c';
char d = c + 5;

Le compilateur erreur disparaît.

Il est sans rapport avec le cas de la finale de chaînes

Ce qui ne l' final modificateur de faire une différence ici?

24voto

assylias Points 102015

La raison en est que la JLS #5.2 (Affectation de conversion) dit:

Si l'expression est une expression constante (§15.28) de type byte, short, char, int, un rétrécissement primitive de la conversion peut être utilisée que si le type de la variable est le byte, short ou char, et la valeur de la constante d'expression est représentable dans le type de la variable.

Dans votre exemple, char c = 'c'; n'est pas une constante , mais final char c = 'c'; est.

La raison en est probablement que l'opérateur d'addition + première convertit ses opérandes entiers. Ainsi, le fonctionnement peut déborder, à moins que tout ce qui est constant, auquel cas le compilateur peut prouver qu'il n'y a pas de débordement.

15voto

Sotirios Delimanolis Points 77933

Lorsque vous appliquez l' + de l'opérateur pour les types intégraux

Binaire numérique de la promotion est effectuée sur les opérandes (§5.6.2).

Dans ce cas, l' char des valeurs sont promues int valeurs.

Ici

char c = 'c';
char d = c + 5;

parce qu' c n'est pas une expression constante, le compilateur ne peut pas déterminer si la valeur de c + 5 qui est un int sera en mesure de tenir dans une char.

Dans ce

final char c = 'c';
char d = c + 5;

c est une expression constante, le compilateur peut déterminer que la valeur de c, ce qui est 99, ajouté à l' 5, ce qui est 104 ne rentre pas dans un char. En raison de cette garantie, Java peut effectuer en toute sécurité un rétrécissement de conversion de int de char.

Si, au contraire, avait

final char a = Character.MAX_VALUE;     
char b = (a + 5);

vous souhaitez voir le même comportement que votre premier test en tant que valeur de a + 5 ne tient pas dans un char. Le compilateur détermine que l' int de la valeur résultant de l' a + 5 ne s'inscrirait pas dans une char.

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