2010-08-04 9 views
3
String messageFile = ... // Assume messageFile SHOULD have the string "MESSAGE" 
System.out.println("The messageFile is: " + messageFile + "!!"); 

Normalement, on attend la commande ci-dessus à la sortie:Bizzare System.out.println() en Java Programme

The messageFile is: MESSAGE!!!! 

Cependant, je reçois ceci:

!!e messageFile is: MESSAGE 

Voyez comment la déclaration ci-dessus, le "!!" les points semblent entourer le message. Ma théorie est que:

String messageFile = ... 

contient plus de caractères que mon supposé "MESSAGE". Par conséquent, il encapsule l'entrée suivante (dans ce cas, le "!!") à l'avant du message System.out.println().

Quel caractère est à l'origine de cette situation?

Extra info:

BTW, messageFile est en cours d'initialisation en passant un argument de ligne de commande à une classe java, myClassA. Le constructeur de myClassA utilise un super() pour passer le paramètre messageFile à myClassB. myClassB passe messageFile dans une fonction().

+0

Est-il possible plus d'un fil est écrire à System.out en même temps? J'ai le sentiment que les PrintStreams utilisés dans System.out ne sont pas thread-safe. –

+0

@matt Les appels individuels à imprimer ou à imprimer se produisent en une seule opération thread-safe, mais si System.out et System.err pointent tous deux vers le même endroit (la console par exemple), ils seront en concurrence et vous pourriez avoir l'air maladroit sortie. –

Répondre

16

Je suppose que vous avez un retour de chariot errant (\r) dans la variable messageFile qui n'est pas accompagné d'un saut de ligne (\n).

EDIT - ce essais comme prévu:

class Println { 
     public static void main(String[] args) { 
       System.out.println("xxxx this \rTEST"); 
     } 
} 

Sortie:

TEST this 
+0

+1 pour avoir raison sur l'argent. –

+0

Ceci est sans doute un problème avec la fonctionnalité élue qui lit dans le message. Il est probable qu'il ne traite pas le format IO de manière appropriée. –

+0

Peut-être quelque part dans le code quelqu'un n'utilise pas la propriété système standard 'line.separator': le séparateur de ligne dépendant de la plateforme (par exemple," \ n "sous UNIX," \ r \ n "pour Windows)" l'application a été développée sur * NIX, mais maintenant utilisée sur certains Windows, avec un \ n codé en dur au lieu de l'utilisation de la propriété line.separator. –

2

Votre variable de message contient éventuellement un caractère '\ r' (retour chariot) ou '\ n' (saut de ligne) à la fin. Cela peut amener le curseur à retourner à la première colonne avant d'imprimer les points d'exclamation.

+0

-1 pour avoir tort. Il doit s'agir d'un retour chariot (qui revient au début de la ligne) et ne peut pas être un saut de ligne (qui descendrait jusqu'à la ligne suivante). Ce sont des retours sur les jours de la machine à écrire quand il s'agissait de deux actions distinctes. Le retour du chariot était lorsque vous avez poussé le rouleau de papier vers la droite pour que vous puissiez recommencer dans la première colonne. Le saut de ligne était quand vous avez poussé dans le petit levier qui a alimenté le papier par une ligne. Sur chaque machine à écrire, j'ai jamais utilisé ceux-ci ont été conçus pour se produire en même temps. –

+0

Je suis pleinement conscient de cela. Mais sans connaître le terminal utilisé par l'afficheur, il est toujours possible qu'il s'agisse d'un saut de ligne interrompu. Il n'y a rien de mal à vérifier les deux. – relet

1

Pour le débogage, vous devez imprimer le codepoint de chaque caractère de messageFile via codePointAt. Par conséquent, vous voyez exactement le contenu de messageFile.

0

Remplacer tous les retours chariot dans le fichier avec des sauts de ligne, puis remplacer tous les doubles sauts de ligne avec simple-retour à la ligne:

messageFile.replace('\r', '\n').replace("\n\n", "\n) 

Les retours chariot doivent être interdits: D

Questions connexes