Erste Schritte Formatierte Ausgabe mit printf()

Mojo Jojo

Mitglied
Hallo,
ich bin gerade neu hinzugekommen und muss gleich eine (für mich) wichtige Frage loswerden. Ich "lerne" Java mit einem Buch vom Markt und Technik Verlag ("Jetzt lerne ich Java") und bin auf ein Problem gestoßen. In dem Unterkapitel zur formatierten Ausgabe mit printf() der Klasse Console, bin ich leider stecken geblieben.
Das Eclipse führt folgendes Programm nicht aus, das ich, da es ein Beispiel aus dem Buch ist, einmal abtippen wollte:

Java:
package basics;
import java.io.Console;

public class CBildschirmausgabe {
  public static void main(String[] args) {
    Console cons = System.console();
    cons.printf("\n");
    
    String ware  = "Heft";
    double preis = 1.75;
    cons.printf(" 1 %10s kostet %.2f Euro \n", ware, preis);

    ware = "Füller";
    preis = 0.55;
    cons.printf(" 1 %10s kostet %.2f Euro \n", ware, preis);  
  }
}


Diese Fehlermeldung wird nach dem Kompilieren angezeigt:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The method printf(String, Object[]) in the type Console is not applicable for the arguments (String)
The method printf(String, Object[]) in the type Console is not applicable for the arguments (String, String, double)
The method printf(String, Object[]) in the type Console is not applicable for the arguments (String, String, double)

at testfiles.CBildschirmausgabe.main(CBildschirmausgabe.java:6)

Es scheint ja irgendeine Exception ausgelöst zu werden. Verwende ich System.console.printf() nicht richtig (habe in der API gestöbert und da stand etwas in der Art der Fehlermeldung, was ich aber nicht verstanden habe).

Ich würde mich sehr freuen, wenn mir jemand bei meinem Problem helfen könnte.
Gruß Mojo Jojo http://www.java-forum.org/images/smilies/confused.gif
 
Man kann es sich auch echt umständlicher machen als es ist ..


Java:
System.out.println(String);

RUHE ... FERTIG
 
1. Hör nicht auf einen Unangemeldeten, er wird schon seine Gründe dafür haben, dass er sich nicht anmeldet. 😉
2. Da scheint was mit dem Autoboxing faul zu sein, weil das hätte funktionieren müssen. Zur Probe:
Java:
package basics;
import java.io.Console;
 
public class CBildschirmausgabe {
  public static void main(String[] args) {
    Console cons = System.console();
    cons.printf("\n", null);

    Object[] pars = new Object[2];
    pars[0]  = "Heft";
    pars[1] = Double.valueOf(1.75);
    cons.printf(" 1 %10s kostet %.2f Euro \n", pars);
 
    pars[0]  = "Füller";
    pars[1] = Double.valueOf(0.55);
    cons.printf(" 1 %10s kostet %.2f Euro \n", pars);
  }
}
 
Den Grund habe ich allerdings ... vor allem wenn ich mich im GRUNDLAGEN-Teil umgucke ... da wird mir manchmal einfach nur noch schlecht ... immer wieder die selben Fragen und Fehler ... Wunschvorstellungen ohne Bezug zur Realität und des Machbaren ... nee ...
Ich mein : warum sollte ich ? Nur um mich als Teil eines Haufen von n00b , Deppen und Kiddies fühlen zu können ... danke ... kann ich drauf verzichten ...
 
Moin,

Den Grund habe ich allerdings ... vor allem wenn ich mich im GRUNDLAGEN-Teil umgucke ... da wird mir manchmal einfach nur noch schlecht ... immer wieder die selben Fragen und Fehler ... Wunschvorstellungen ohne Bezug zur Realität und des Machbaren ... nee ...
Ich mein : warum sollte ich ? Nur um mich als Teil eines Haufen von n00b , Deppen und Kiddies fühlen zu können ... danke ... kann ich drauf verzichten ...

wenn Dich das alles so sehr stört, warum lässt Du es dann nicht ganz sein ???:L :noe:
Oder ist es jetzt nicht ganz so schlimm für Dich, nur weil Du NICHT angemeldet bist ???:L ???:L

Gruß
Klaus
 
Ich mein : warum sollte ich ? Nur um mich als Teil eines Haufen von n00b , Deppen und Kiddies fühlen zu können ... danke ... kann ich drauf verzichten ...

Tja, aus der Anonymität heraus lässt sich gut motzen. Ich kann von mir sagen, dass ich mich nie verstecke - ausser ein einziges mal aber das war so offensichtlich, das haben wohl alle bemerkt ;-)

[IDENTITÄTSKRISE]Hilfe ich weiss nicht zu welcher der drei erwähnten Gruppen ich gehöre ;( [/IDENTITÄTSKRISE]

Zurück zum Thema
Java hat IMO einen komfortableren Mechanismus

Java:
system.out.println(String.format(formatString, wert1, wert2[, wertn]));

und anstellen von "\n" o.ä. sollte
Java:
public static String newline = System.getProperty("line.separator");
verwendet werden.
 
Zuletzt bearbeitet:
Hat eigentlich noch jemand ausser mir auf die Exceptions geschaut? ob "printf" oder "format" und selbst die Klasse der Ausgabe ist egal. Alle in Frage kommenden Methoden verwenden als Parameter einen String und dieses "Object ... args". Selbst das KSKB des TS wird in Eclipse zumindest, so wie es da steht, korrekt kompiliert. Das bedeutet, seine Methodenaufrufe passen bis auf den einen Primitivtypen. Fazit: Da passt nach wie vor was mit dem Autoboxing nicht.
[EDITH]Da sich im übrigen Autoboxing afaik nicht abschalten lässt, würde ich mal tippen, dass das JDK ein Prä 1.5er ist bzw. zumindest gegen eine solche Zielplattform kompiliert werden soll. Alledings... dann würde ja auch "Console" bereits angemeckert werden.[/EDITH]
 
Zuletzt bearbeitet von einem Moderator:
Vielleicht wird versucht, mit Java 1.4 einen mit >= Java 1.5 kopilierten Code aufzurufen? Dass es seit Java 5 Var args gibt, kann die JVM von 1.4 nicht riechen 😉
 
Ganzh offensichtlich versucht der formatter ncht zu casten - wieos da eineNPE gibt ist mir schleierhaft.
Aber die erste Variante ist eh die schönere ...

Java:
import java.io.Console;

public class CBildschirmausgabe {
	
	public static String nl = System.getProperty("line.separator");

	public static void main(String[] args) {
		Console cons = System.console();

		Object[] pars = new Object[2];
		pars[0]  = "Heft";
		pars[1] = Double.valueOf(1.75);
		System.out.println(String.format(" 1 %10s kostet %.2f Euro \n", (String)pars[0], (Double)pars[1]));
		cons.printf(" 1 %10s kostet %.2f Euro " + nl, pars);
	}
}
 
Hallohttp ://www.java-forum.org/images/smilies/smile.gif ,

erst einmal vielen Dank an alle, die sich die Mühe gemacht haben, die Ursache bzw. die Lösung des Problems zu benennen. Leider bin ich noch nicht weit gekommen mit Java (ist auch die erste Programmiersprache, die ich erlerne) und kann Eure Aussagen nur vage interpretieren.

Wenn ich das richtig verstanden habe, muss ich gar nichts mit irgendwelchen Wrappern machen oder zum jetzigen Zeitpunkt verstehen, was das ist, weil ich mit der falschen JDK-Version/ der "falschen" IDE arbeite?

Derzeit arbeite ich mit Java 6 Update 26, Eclipse Release 3.2.1 und dem Buch, das Java 6 behandelt. Leider hat es mit keinem der geposteten Quelltexte funktioniert (Eine Ausgabe mit Printwriter ist auch nicht möglich).

Soweit ich die Fehlermeldungen richtig deute, will der Compiler, dass ich parse/ wrappe, also irgnedetwas mit Object mache...
 
NPE gibt es weil es unter Eclipse kein System.console() gibt 😉
Hmmpffff 😳 peinlich

Darf ich fragen, aus welchem Grund du das Objectarray wieder auseinander reist?
Weil ich unter der falschen Annahme, dass nicht gecastet wird, manuell casten wollte - aber wie gesagt, das hat sich alles erledigt und ich geb zu, dass ich was gelernt habe.

Es tut einfach so - tja ....

Java:
public class CBildschirmausgabe {
	
	public static String nl = System.getProperty("line.separator");

	public static void main(String[] args) {
		Object[] pars = new Object[2];
		pars[0]  = "Heft";
		pars[1] = Double.valueOf(1.75);
		System.out.println(String.format(" 1 %10s kostet %.2f Euro \n", pars));
	}
}
 
Hi,

habe jetzt Eclipse 3.7.1 installiert und es noch einmal versucht. Leider war das auch vergebens.

Java:
// Hier nochmal der Quellcode (Ist der soweit in Ordnung?)
package basics;
import java.io.*;

public class CBildschirmausgabe {
	public static void main(String[] args) {

	    Console cons = System.console();
	    cons.printf("\n");
	    
	    String ware  = "Heft";
	    double preis = 1.75;
	    cons.printf(" 1 %10s kostet %.2f Euro \n", ware, preis);

	    ware = "Füller";
	    preis = 0.55;
	    cons.printf(" 1 %10s kostet %.2f Euro \n", ware, preis);  
	}
}

Fehlermeldungen nach Kompilieren:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The method printf(String, Object[]) in the type Console is not applicable for the arguments (String)
The method printf(String, Object[]) in the type Console is not applicable for the arguments (String, String, double)
The method printf(String, Object[]) in the type Console is not applicable for the arguments (String, String, double)

at basics.CBildschirmausgabe.main(CBildschirmausgabe.java:8)

Soweit ich das verstehe, habe ich die Methode printf() in Bezug auf die Argumente nicht korrekt verwendet. Wurde die Methode irgendwann mal "geändert", so dass mich mein Buch den falschen Umgang mit ihr lehrt? Ich habe versucht, die Variable Preis als ein Wrapper-Objekt zu deklarien, aber das ging auch nicht.

Java:
    Console cons = System.console();
    System.console().printf(null, args);
    cons.printf("\n",args); // Das akzeptiert er, obwohl es auch ohne args gehen sollte.

Ich hoffe, ich strapaziere Eure Nerven nicht auf's Äußerste mit dieser Sache, aber leider fallen mir auch keine Gründe mehr ein, warum das so ist. Mit PrintWriter läuft's auch nicht, das kommt im nächsten Abschnitt des Buches... :autsch:

PS: Das mit dem Parsen hat auch nicht geklappt. (#9 von Andi CH). format() findet akzeptiert er auch nicht.
 
Zuletzt bearbeitet:
Nehme mal an, dass das Projekt nun so wie es war inklusive der Ziel-Platform, aus Eclipse 3.2.1 importiert wurde. Deswegen in Eclipse "Window->Preferences->Java->Compiler" und die Compliance-Settings auf 1.5 oder höher stellen. Ich hoffe das ist es dann auch, weil normalerweise könnte man die Klasse "Console" in einer pre 1.6 JRE gar nicht verwenden. Deswegen nehme ich mal stark an, dass das Problem doch schwerwiegender ist.
 
Hi,

habe jetzt das JDK 7 installiert, die von Dir genannten Einstellungen vorgenommen, in Eclipse das neue JDK aktiviert, einen neuen Workspace erstellt und den alten gelöscht (also die Konfigurationsdateien gelöscht, die noch von früher da waren). Sicherlich habe ich noch mehr versucht, aber es hat nicht geklappt. 🙁
Ich denke, dass der Fehler bei dem Buch zu finden ist. die Methode printf(), so viel weiß ich jetzt, erwartet folgende Parameter:
Java:
...
Console cons System.console();
cons.printf(format, args); 
// oder 
cons.printf(null, args);
...

Wie so ein Formatstring aufgebaut und verwendet werden kann/ soll, steht wohl in der Dokumentation. Mit meinem dürftigen Fähigkeiten kann ich nur sagen, dass es anders aussieht als in meinem Buch. Zwar kommt keine Bescherde beim Eintippen (IDE), aber beim Kompilieren/ Ausführen wird eine NULLPOINTEREXCEPTION ausgelöst durch.
Java:
console.printf(.....);
Ich denke, ich werde die Lektüre wechseln. Vielleicht die "Java-Insel" oder so ähnlich.

Auch wenn das jetzt nicht geklappt hat, vielen Dank nochmal für die schnelle Hilfe und Geduld.
 
Ich denke, ich werde die Lektüre wechseln. Vielleicht die "Java-Insel" oder so ähnlich.

Das Beispiel aus dem Buch ist völlig in Ordnung und der Fehler liegt nicht am Buch sondern an dir, weil:
1. Eclipse benutzt seinen eigenen Compiler, daher völlig irrelevant welches JDK du installiert hast. Wie schon weiter oben gesagt musst du in den Eclips Einstellungen die Java Version einstellen, damit die Syntax aus dem Buch funktioniert.
2. Wie auch weiter oben gesagt gibt es in Eclipse keine echte Konsole, daher liefert System.console() null.

Lösung: Führe das Programm auf einer echten Konsole aus, und am besten kompilierst du das Programm auch gleich auf der Konsole.
 
1. Eclipse benutzt seinen eigenen Compiler, daher völlig irrelevant welches JDK du installiert hast. Wie schon weiter oben gesagt musst du in den Eclips Einstellungen die Java Version einstellen, damit die Syntax aus dem Buch funktioniert.
Hä??? Seit wann? Bei Eclipse kannst du einstellen welches JDK verwendet werden soll.

Und aus meinem Bespiel oben (auch wenn ich erst einen Überlegungsfehler gemacht habe) kannst du entnehmen, dass System.out.printeln wohl die bessere Wahl ist als Console - das tut nämlich einfach so.
 
Zuletzt bearbeitet:
Hä??? Seit wann? Bei Eclipse kannst du einstellen welches JDK verwendet werden soll.

Du kannst die Java-Laufzeitumgebung einstellen. Die kann natürlich auch aus einem JDK kommen. Aber den Compiler ist in Eclipse eingebaut. Es ist ein inkrementieller Compiler, der solch praktische Sachen wie Hot Code Replacement möglich macht.
 
Ob das unbedingt ein Vorteil ist ist die Frage; Zumindest sind die Console-Streams zum lesen und schreiben in der Console fest, während man sie bei System austauschen kann. System hat ja bekanntlich auch noch einen Error-Stream, die Console nicht. Dieser Errorstream ist standardmässig gleich "System.out". Die Console hat obendrein noch eine Methode um Passwörter von der Tastatur zu lesen ohne sie als Klartext anzuzeigen. Will man also wirklich die System-Standard-Streams verwenden, kann man sich nur auf die Console verlassen.
 

Neue Themen


Zurück
Oben