Est-ce que Java vérifie tous les arguments dans l'opérateur « && » (et) même si l'un d'eux est faux?

StackOverflow https://stackoverflow.com/questions/4163742

Question

Je tel code:

if(object != null && object.field != null){
    object.field = "foo";
}

On suppose que l'objet est nulle.

Est-ce que le résultat du code dans NullPointerException ou tout simplement si la déclaration ne sera pas exécutée?

Dans le cas contraire, comment refactoriser ce code pour être plus élégant (s'il est possible bien sûr)?

Était-ce utile?

La solution

Java ne comporte l'évaluation de court-circuit, à savoir votre code devrait être ok

Autres conseils

&& ne court-circuit alors que & ferait pas.

Mais avec des questions simples comme celui-ci, il est préférable d'essayer juste (ideone peut aider lorsque vous n'avez pas accès à une machine).

&& - http://ideone.com/LvV6w Et - http://ideone.com/X5PdU

Enfin, la place pour vérifier à coup sûr serait le JLS §15.23 . Non la chose la plus facile à lire, les états de section relevent: L'opérateur && est comme & ( §15.22. 2 ), mais évalue son droit opérande que si la valeur de sa main gauche opérande est vrai.

La meilleure façon de savoir serait l'essayer, en particulier pour une seule question de la ligne. Aurait été plus rapide aussi.

La réponse est que Java ne sera pas exécuté le corps du « si ».

Cela ne jette aucune NullPointerException. La condition sera évaluée de gauche à droite et le moment première expression de false est trouvé, il ne reste Évalue une expression.

Une façon de le savoir! Essaye-le! Comment? Eh bien, faire une méthode qui imprime quelque chose:

public static boolean test(int i)
{
    System.out.println(i);
    return false;
}

...

if (test(1) && test(2) && test(3))
{
    // not reached
}

Cette impression:

1

La réponse à votre question est "non".

Peut-être que cette autre question vous aide:

différences dans les opérateurs booléens: & vs && et | vs ||

Java a évaluation de court-circuit, il sera très bien.

Le code me semble ok, mais avez-vous réellement besoin de vérifier object.field != null? Je pense que test peut être omis que vous ne jamais utiliser la variable, juste régler.

D'un côté note, la plupart des programmeurs ne serait pas directement les champs d'accès (de object.field), mais plutôt par getters / setters (object.setField(x);). Sans plus de contexte pour aller, je ne peux pas dire si cela est approprié dans votre cas.

|| et && conditions arrêts au point qu'ils peuvent décider si la condition est vrai / faux, dans votre cas, la condition s'arrête juste après object != null et je pense que votre code est très bien pour ce cas

Si vous voulez que tous vos expressions booléennes évalué quelle que soit la valeur de vérité de chacun, vous pouvez utiliser & et | au lieu de && et ||. Cependant assurez-vous que vous utilisez uniquement sur ces expressions booléennes. Contrairement à && et ||, & et | aussi avoir un sens pour les types numériques qui est complètement différent de leur signification pour booléens. http://ibiblio.org/java/course/week2/46.html

Bien que court-circuit fonctionnerait ici, ce ne est pas une garantie que (comme je l'ai fait plusieurs fois), vous aurez le mauvais de l'ordre lors de l'écriture une autre, il serait préférable pratique nicher les instructions if et de définir l'ordre que vous voulez les contrôles booléens pour briser:

if(object != null) 
{
    if(object.field != null)
    {
        object.field = "foo";
    }
}

fait exactement la même chose que vous dites essentiellement, si le premier contrôle booléenne échoue ne pas faire la seconde; il est aussi sûr que NullPointerException object.field ne sera pas vérifié, sauf si l'objet est non nul

Utilisation de court-circuit sur booléens peut devenir gênant plus tard que lorsque vous avez un multiple bool instruction if il devient plus délicat de façon efficace debug quelle partie court-circuité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top