2015-07-20 1 views
1

Lors de la pratique de tableaux Java dans Eclipse, j'ai rencontré ce comportement bizarre de tableaux.Séquence du résultat Sysout

public class base3 { 
    public static void main(String[] args) { 
     int arr[]= new int[25]; 
     System.out.println(arr[0]); 
     //System.out.println(arr[25]); 
     System.out.println(arr[-10]); 
    } 
} 

sortie de ceci est:

0 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -10 
at base3.main(base3.java:6) 

Mais dès que je change l'indice de troisième sysout -10 à -11, la séquence des changements de sortie. Pourquoi la séquence de sortie change-t-elle avec l'index de la matrice?

+1

Je dint obtenir ce type de comportement [voir] (http://ideone.com/K9CkvJ) – silentprogrammer

+0

@Swanand Pangam il doit être cohérent dans les deux cas, exécuter en utilisant l'invite de recommandation –

+1

Ce que vous voyez dans la console ('0' avant d'après l'exception) est probablement juste un entrelacement multi-thread. Je soupçonne fortement que vous pouvez obtenir les deux sorties, avec n'importe quel index hors plage (par exemple -10, -11 ou autre). Avez-vous essayé de répéter votre expérience plusieurs fois? –

Répondre

6

Ceci est dû au fait que la sortie est écrite dans un fichier différent. La sortie 0 est imprimée sur la sortie standard (fd 1) et l'exception sur l'erreur standard (fd 2). Vous pouvez voir quand vous redirigez erreur standard pour /dev/null

❯ java base3 2>/dev/null 
0 

Voyez comment vous ne recevez pas exception ici. Donc, l'ordre ici ne sera pas prévisible en raison de la sortie écrite dans différents fichiers.

+0

Alors pouvez-vous expliquer pourquoi cela se produit d'une manière particulière seulement comme je l'ai expliqué dans mon dernier commentaire ci-dessous question . Quoi qu'il en soit, merci. –

+0

@SwanandPangam J'ai essayé de -11 et -25 et tous les résultats étaient en ordre. – barunsthakur

+0

Un bogue d'éclipse pertinent https://bugs.eclipse.org/bugs/show_bug.cgi?id=6036 – barunsthakur

1

Le java documentation indique Prints this throwable and its backtrace to the standard error stream..

Je pense que vous regardez une condition de concurrence entre l'erreur standard et la sortie standard pour imprimer des choses à la console. Lorsque l'exception ArrayIndexOutOfBoundsException est levée, elle n'est pas traitée en imprimant à System.out mais à System.err. Comme les deux flux doivent partager la ressource de la console, l'ordre dans lequel ils ont accès détermine l'ordre des instructions d'impression.

Le changement de -10 à -11 ne devrait pas influencer le résultat. C'est le temps entre l'appel à System.out.println(arr[0]); et System.out.println(arr[-10]); qui influence l'ordre de la sortie.