Java Verstehe den Unterschied zwischen println(); und println(); nicht

vram78

Lieutenant
Registriert
Dez. 2015
Beiträge
712
Hallo,

Es gibt ja einmal System.out.println(); und System.err.println();

Es sind 2 unterschiedliche Objekte der selben Klasse, die genau das Gleiche machen wollen. Aber trotzdem kommen unterschiedliche Ergebnisse in Eclipse raus, die println(); Methode mit dem Objekt err hat zu Folge, dass z.B Strings rot sind. Wie kann das sein?

Mfg
 
Das eine geht in den stdout Kanal und das andere in den stderr Kanal. Sind zumindest unter unixoiden Systemen zwei Standardkanäle, die jeder Prozess zugewiesen bekommt, um Meldungen auszugeben. Dabei kann dann "bequem" zwischen Fehlermeldungen und sonstigen Ausgaben unterschieden werden.
 
  • Gefällt mir
Reaktionen: eigsi124
Das eine "druckt" den Standard vom System aus und das andere den Standard "Fehler".
 
KWMM schrieb:
2 Sekunden Suchmaschine.....
Verstehe ich trotzdem nicht. Out und Err wollen ein und das Selbe machen, genau die gleiche Methode ausführen aber es kommen trotzdem umterschiedliche Ergebnisse
 
vram78 schrieb:
Wie kann das sein?

Eclipse verwendet einfach unterschiedliche Farben für die Ausgabe. System.err wird in der Regel für Fehlerausgaben etc. verwendet. Mit den Java-Klassen selbst hat das nichts zu tun. Der Unterschied liegt einzig darin, wie Eclipse die Streams handhabt.
 
vram78 schrieb:
Out und Err wollen ein und das Selbe machen, genau die gleiche Methode ausführen aber es kommen trotzdem umterschiedliche Ergebnisse
Beschäftige dich bitte mit Streams: https://stackoverflow.com/questions/3385201/confused-about-stdin-stdout-and-stderr

Wenn du Bälle nach Farbe sortierst, steckst du sie ja auch nicht alle in den selben Eimer. Jede Farbe hat einen Eimer. Ein blauer Ball geht in den blauen Eimer (out.println()), ein gelber Ball in den gelben Eimer (err.println()). Nur weil du immer einen Ball in einen Eimer wirfst (println()), passiert es nicht aus dem selben Grund.
 
  • Gefällt mir
Reaktionen: Nase und holy_fish
String ist auch immer die selbe Klasse... und dennoch kommt da meistens was anderes raus...
 
  • Gefällt mir
Reaktionen: Departet
Yuuri schrieb:
Wenn du Bälle nach Farbe sortierst, steckst du sie ja auch nicht alle in den selben Eimer. Jede Farbe hat einen Eimer. Ein blauer Ball geht in den blauen Eimer (out.println()), ein gelber Ball in den gelben Eimer (err.println()). Nur weil du immer einen Ball in einen Eimer wirfst (println()), passiert es nicht aus dem selben Grund.
Ich hab deinen Text so verstanden, dass Objekte ebenfalls eine Rolle spielen bzw. konfigurierbar sind, weswegen es zu unterschiedlichen Ergebnissen kommt, obwohl man die gleiche Methode verwendet
 
vram78 schrieb:
Out und Err wollen ein und das Selbe machen, genau die gleiche Methode ausführen
Nein, wollen sie eben nicht.
Du kannst auch zwei Klassen haben, "Katze" und "Hund" und beide haben die Methode "machLaut()", wobei einmal "Miau" und einmal "Wuff" bei raus kommt.

Nur weil Methoden gleich heißen, heißt das nicht, dass sie das gleiche machen wollen.
In dem Fall will der PrintStream hinter System.out eben in die Standard-(Normal)-Ausgabe schreiben und der PrintStream hinter System.err in die Standard-Fehler-Ausgabe.

Edit/Ergänzung:
vram78 schrieb:
Ich hab deinen Text so verstanden, dass Objekte ebenfalls eine Rolle spielen bzw. konfigurierbar sind, weswegen es zu unterschiedlichen Ergebnissen kommt, obwohl man die gleiche Methode verwendet
Genau, sowohl hinter System.out als auch hinter System.err steckt ein PrintStream, weshalb sie die gleichen Methoden haben. Sie sind nur anders "konfiguriert" und machen deshalb unterschiedliche Dinge, nämlich einmal nach Standard-Ausgabe und einmal nach Standard-Fehler-Ausgabe schreiben.
 
Zuletzt bearbeitet:
kthxbye schrieb:
Nein, wollen sie eben nicht.

Doch, wollen sie. Was evident sein sollte, da es zwei Instanzen der gleichen Klasse sind. Natürlich funktionieren die auch gleich.

Der farbliche Unterschied kommt wie gesagt durch Eclipse zustande. Die Farbe lässt sich konfigurieren, falls es stört.
 
vram78 schrieb:
Out und Err wollen ein und das Selbe machen, genau die gleiche Methode ausführen
Fast. System.out und System.err sind beides Instanzen derselben Klassen, PrintStream. Dennoch sind es unabhängige Objekte, bei denen eben auch bestimmte Parameter anders sein können - zB ob der Output an stdout oder stderr geht.



Verschiedene Output-Streams gibt es im übrigen mitnichten nur bei Linux. Auch unter Windows gibt es das, nämlich 1 (stdout) und 2 (stderr), was sich man auch in diversen Batch-Dateien wiederfindet (dort steht dann zB 2>&1 , was stderr in stdout umleitet und somit zB in eine Datei geschrieben werden kann).
 
  • Gefällt mir
Reaktionen: vram78
Ah
Ergänzung ()

Raijin schrieb:
bei denen eben auch bestimmte Parameter anders sein können
Also lag ich nicht falsch damit, dass eben diese Objekte anders konfiguriert wurden bzw. Eben andere Parameter haben? Weswegen auch beim gleichen Methodenaufruf unterschiedliche Ergebnisse rauskommen, weil die Objekte an sich anders sind?
 
Nur mal ein Beispiel zur Veranschaulichung in Form eines Kommandos für die Eingabeaufforderung unter Windows:


Code:
route add 34325353626 1>test1.txt 2>test2.txt

Der Befehl führt ein fehlerhaftes route Kommando aus und leitet den Output 1 (=stdout) in test1.txt um, während Output 2 (=stderr) in test2.txt geschrieben wird.

Da route im Fehlerfall ausschließlich auf stderr schreibt, bleibt test1.txt leer, weil stdout (1) eben leer war. test2.txt wiederum enthält den Fehlertext von route, den Inhalt von stderr (2).

Würde man nun ein korrektes route Kommando verwenden, stünde in test1.txt "OK!" und test2.txt wäre leer.
 
vram78 schrieb:
Also lag ich nicht falsch damit, dass eben diese Objekte anders konfiguriert wurden bzw. Eben andere Parameter haben? Weswegen auch beim gleichen Methodenaufruf unterschiedliche Ergebnisse rauskommen, weil die Objekte an sich anders sind?

Jein, die Instanzen haben andere Quellen, aber das hat nichts mit der unterschiedlichen Farbe zu tun.
 
Ich denke die Farbe ist das unwichtigste an der Stelle bzw. von dir auch schon hinreichend behandelt.
Eclipse färbt out und err eben unterschiedlich ein, Ende der Geschichte.

Rossie schrieb:
Doch, wollen sie. Was evident sein sollte, da es zwei Instanzen der gleichen Klasse sind.
Genau eben nicht. Nur weil es zwei Instanzen der gleichen Klasse sind (was du übrigens nicht mal wissen kannst, weil auch eine von PrintStream erbende Klasse reingereicht werden könnte) heißt das nicht, dass sie das gleiche machen.

Das hängt am Ende vom Abstraktionslevel ab. Wüsstest du exakt welche Instanzen dort greifen und wie sie beschaffen sind könntest du eine Aussage darüber treffen, ob sie "das gleiche machen wollen".
Das einzige, was du aber wirklich weißt ist, dass es ein PrintStream ist der eine println Methode bereitstellt, die per Definition "einen String ausgibt und die Zeile terminiert".

Deswegen "Abstraktionslevel":
Machen sie das gleiche im Sinne von "geben einen String aus und terminieren die Zeile?"
Ja, dann machen sie das gleiche.

Machen sie das gleiche im Sinne eines Thread-Erstellers, der sich über die Farben in der Konsole wundert?
Offensichtlich nicht, sonst würde der String im exakt gleichen Output mit der exakt gleichen Formatierung enden.
 
  • Gefällt mir
Reaktionen: vram78
Rossie schrieb:
aber das hat nichts mit der unterschiedlichen Farbe zu tun.
Ja also das mit den unterschiedlichen Farben mal beiseite gelassen, habe verstanden, dass Eclipse dies selber macht
 
Zurück
Oben