Zum Inhalt springen

Sofus

Mitglieder
  • Gesamte Inhalte

    12
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Sofus

  1. Der größte Irrglauben besteht darin das ein Aufruf von read() eine direkte Eingabe des Benutzers abfordert. Dies ist aber nicht zwangsläufig der Fall, lediglich wenn der Eingabestrom leer ist wird der Benutzer um eine Eingabe gebeten. Da der StandardInput aber vom zu Grunde liegenden Betriebssystem für jedes Programm beim Start des Programms festgelegt wird, kann es sich hierbei aber auch um eine Datei anstatt der üblichen Tastatur handeln. Dann wird der Benutzer beim Aufruf von read() nie nach einer Eingabe gefragt. Hier ein Beispiel zum Ausgeben einer Datei in der Console mit Hilfe von System.in. Das Programm ist zwar eher ein typisches C-Programm aber was mit C geht kann ja auch mit Java gehen. import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) { InputStreamReader eingabe = new InputStreamReader(System.in); try { int zeichen = eingabe.read(); while(zeichen != -1) { System.out.print((char) zeichen); zeichen = eingabe.read(); } } catch (IOException e) { System.err.println("Es ist ein Fehler beim lesen von System.in aufgetreten" +"\nDie Ausgabe des InputStreams wird abgebrochen"); } } } java Main <Main.java Mit obigem Aufruf wird das Programm veranlasst seinen eigen Quellcode auf der Konsole auszugeben. Aber kommen wir nun auf das Problem des mehrmaligen Schleifendurchlaufs zurück. Bei der Eingabe von "rechts" wird das erste r als Rechts gewertet und ein neues Auto-Objekt erstellt. Im Eingabestrom steht jetzt aber immer noch "echts" also wird die Schleife noch weitere 5 mal durchlaufen, die in der Eingabe gefundenen Buchstaben werden verworfen, die Ausgabe erfolgt aber jedes mal. Erst nach dem der Eingabestrom leer ist hält das Programm wieder an und wartet auf eine Eingabe vom Benutzer. Allerdings habe ich jetzt die beiden nicht sichtbaren Zeichen 10 und 13 unterschlagen, was dazu führt das die Schleife nicht wie oben angedeutet 5 mal sondern 7 mal durchlaufen wird . Für definitive Benutzereingaben über die Console gibt es ab Java 1.6 das "Console"-Objekt. Hier ein Beispiel: Console console = System.console(); if(console == null) { System.err.println("Es konnte kein Consolen-Objekt erstellt werden" +"\nStellen Sie sicher das keine Datei als Eingabe verwendet wird"); System.exit(-1); } System.out.print("Eingabe : "); String eingabeZeile = console.readLine(); System.out.println("Ihre Eingabe war: " +eingabeZeile);
  2. So rätselhaft ist das Verhalten von deinem Programm gar nicht, wenn man die genaue Funktionsweise von read() kennt. Versucht doch einfach mal "Rechts" oder "rechts" ein zugeben, vielleicht wird dann einiges klarer
  3. Sofus

    Java Literatur

    @flashpixx So wirklich widersprechen kann ich dir da nicht, denn ich bin auch kein Freund von Programmen, in denen sich Anfänger per Drag and Drop erste Ergebnisse zusammen klicken können. Deswegen finde ich deine Empfehlung für einen Editor mit Syntax highlighting ohne großen Schnickschnack genau richtig. Doch BlueJ ist eigentlich genau Das. Ich sehe hier keine Möglichkeit mir Code zusammen zu klicken, wenn ich den Button "Neue Klasse" verwende werde ich aufgefordert den Namen meiner Klasse ein zugeben und bekomme dann eine leider nicht ganz leere java-Datei, dies kann man aber in den Templets für neue Klassen leicht ändern. In der Standardeinstellung müsste man jetzt den Gnzen Rumpf der Klasse löschen. Für alle die BlueJ nicht kenne hier die automatisch erzeugte Klasse bei der Eingabe "Nachricht" als Klassennamen: /** * Beschreiben Sie hier die Klasse Nachricht. * * @author (Ihr Name) * @version (eine Versionsnummer oder ein Datum) */ public class Nachricht { // Instanzvariablen - ersetzen Sie das folgende Beispiel mit Ihren Variablen int x; /** * Konstruktor für Objekte der Klasse Nachricht */ public Nachricht() { // Instanzvariable initialisieren x = 0; } /** * Ein Beispiel einer Methode - ersetzen Sie diesen Kommentar * mit Ihrem eigenen * * @param y ein Beispielparameter für eine Methode * @return die Summe aus x und y */ public int beispielMethode(int y) { // tragen Sie hier den Code ein return x + y; } } Jetzt kann man natürlich eine weitere Klasse zum Beispiel "PrivateNachricht" anlegen und dann in der grafischen Oberfläche ein Vererbungspfeil von PrivaterNachricht zu Nachricht ziehen. Was in dem Code von PrivaterNachricht lediglich dazuführt, dass im Kopf der Klasse ein extends Nachricht angefügt wird. Die Klasse an sich schreibt man aber völlig selbst ohne irgendwelche Einschränkungen hinsichtlich der Möglichkeiten die die Sprache Java bietet. Der Eigentlich Vorteil von BlueJ liegt aber darin Java-Anweisungen interaktiv ausführen zu können, ähnlich wie in der Python-Konsole. Zu finden ist das Ganze unter "Ansicht" -> "Direkteingabe anzeigen" - Ein Beispiel: Mit '>' sind Eingaben und ohne '>' sind Ausgaben der Direkteingabe gemeint. > 4 +4 8 (int) > true && false false (boolean) > double x = 0.1 + 0.1 + 0.1; > x == 0.3 false (boolean) > import java.util.*; > new Scanner("12 13 14") <object reference> (Scanner) Die Referenz von Scanner kann man jetzt per Drag and Drop in die Objektleiste ziehen, wo man nun per Rechtsklick auf das Objekt alle Methoden die dieses Objekt zur Verfügung stellt angezeigt bekommt. Jetzt kann man nach belieben unterschiedliche Methoden aufrufen, zum Beispiel hasNextInt() oder nextInt(). Auch der momentane Zustand des Obejktes lässt sich so untersuchen, ruft man nextInt() auf kann man genau verfolgen wie sich die private Instanzvariable position des Scanner-Objektes verändert. Alles Dinge die dabei helfen sollen das Verhalten und das Benutzen von Objekten zu verstehen. Aus diesem Grund wurde auch BlueJ ausschließlich für die Lehre geschrieben. BuleJ ist zwar kein Buch, kann aber trotzdem nützlich sein bei dem Versuch seine ersten eigenen Klassen näher zu Untersuchen und interaktiv mit ihnen zu interagieren. Main-Methoden sind dabei überflüssig.
  4. Sofus

    Java Literatur

    Um das Buch jetzt nicht vollständig unter deiner Kritik untergehen zulassen, hier ein Rettungsversuch: Das Buch beschäftigt sich mit der Programmierung in Java an sich, BlueJ ist da nur Mittel zum Zweck und jeder der ein paar Grundkenntnisse in Java besitzt kann die Aufgaben natürlich auch ohne BlueJ lösen. @flashpixx Trotzdem würde mich natürlich interessieren wieso du meinst das BlueJ den OOP-Ansatz nicht wieder spiegelt oder gar vereinfacht.
  5. Ok, ich muss mich korrigieren. Math.round() liefert eine Ganzzahl und wenn du eine Ganzzahl durch eine Ganzzahl teilst werden die Nachkommastellen immer abgeschnitten, da die Berechnung wieder eine Ganzzahl ergibt und erst dann eine Konvertierung nach double stattfindet. -Mein Fehler :old
  6. Hallo Huwy, das Ganze ist so, wenn du 100 schreibst dann nimmt der Compiler an das es ein int ist, wenn du hingegen 100l schreibst ist es ein long, bei 100.0f ist es ein float und bei 100.0 double. Allerdings kann ich auch nach mehrmaligem durchsehen überhaupt keinen Grund erkennen warum du 100.0 schreiben müsstest anstatt 100, da ein cast von einem kleinen Wert wie int, long, float in einen größeren Wert wie double vom Compiler immer stillschweigend vorgenommen wird. Bei Geldbeträgen und double oder float bin ich immer besonders Vorsichtig, eigentlich würde ich hier lieber je nach Größe das Betrags int oder long empfehlen. Warum? Weil double x = 0.1 + 0.1 + 0.1 ungleich 0.3 ist!
  7. Sofus

    Java Literatur

    An dieser Stelle möchte ich einfach mal mein absolutes lieblings Buch im Bereich der Java-Programmierung erwähnen, weil ich das Gefühl habe, dass dieses Buch zu unrecht etwas vernachlässigt wird. Jeder hat irgendwie das Handbuch der Java-Programmierung, ich übrigens auch , allerdings finde ich dieses Buch gar nicht so toll - zum Nachschlagen ja - zum lesen und lernen eher nein. Aber kaum einer kennt Java lernen mit BlueJ von David J. Barnes und Michael Kölling. Ok was ist so toll an dem Buch? - Naja zum einen fängt es ganz von vorne an, ich selbst habe das Buch zu einer Zeit gelesen wo meine Programmierkenntnisse in Java, naja sagen wir "gut" waren, trotzdem kam bei diesem Buch keine Langeweile auf. - Das Buch hält sich an den "Object First"-Ansatz, ist also komplett Objektorientiert, so wie ich es bis jetzt noch in keinem anderen Buch finden konnte. - Außerdem beschäftigt sich das Buch neben der reinen Programmierung auch mit softwaretechnischen Aspekten, wie zum Beispiel Refactoring, Kohäsion, Kopplung oder Abstraktion. Nun gut die Begriffe werden jetzt nicht gerade tiefschürfend behandelt, aber man lernt, dass es neben dem reinen Programmieren auch noch andere Dinge für das Erstellen von Software gibt die wichtig sind. - Erreicht wird das ganze durch ein projektorientiertes Vorgehen. Man hat nicht einfach irgendwelche Programmcodeschnipsel die das gezeigte verdeutlichen sollen, sondern man hat eine Aufgabe (Projekt) das in Software umgesetzt werden soll, anhand dessen die Programmierung mit Java Stück für Stück erklärt wird. Ein nettes Beispiel ist das Erstellen eines textorientierten Adventures aus Kapitel 7. Ach und noch eins, das Buch lässt sich wunderbar flüssig und angenehm einfach lesen. So, nun aber genug der Werbung, für alle die auf dieses Thema stoßen und bei denen ich Interesse wecken konnte, schaut euch das Buch einfach mal an - @Ulfmann ob das Buch auch für dich infrage käme kann ich schlecht sagen, ich glaub du suchst lieber etwas weiterführendes.
  8. Sofus

    Java Literatur

    Hallo Ulfmann, ich habe beide von dir erwähnten Bücher hier zu hause liegen, das Java 6 Übungsbuch jedoch nur als Leihgabe der FH-Bibliothek, weshalb ich es bisher auch nur mal durch geblättert habe. Ich weiß bei diesem Buch allerdings nicht so recht was ich von davon halten soll, es gibt eine kurze Erklärung der Themen und anschließend eine Reihe von Übungsaufgaben. Ich halt einfach mal mein Finger rein und such dir mal eine raus: Eine für das Graphics-Objekt vordefinierte Eigenschaft ist die [I]clip-rectangle[/I]-Eigenschaft. Definieren Sie in Analogie zur Klasse [I]JComponentmitpaintundohneclipBounds[/I] aus Aufgabe 4.5 eine Klasse [I]JComponentmitpaintundclipBounds[/I], die für das Neuzeichnen einer Komponente, nachdem die Größe des Fensters abgeändert wurde, das Clip-Rectangle nutzt. Für die Klassennamen kann ich übrigens nichts, die standen dort genau so auch in dem Java6 Übungsbuch. Das andere Buch hingegen kann ich dir aber uneingeschränkt empfehlen, jeder der früher oder später mal vor hat Programme im größeren Maßstab zu schreiben muss einfach ein Buch über Entwurfsmuster gelesen haben! So was gehört einfach zum Repertoire eines jeden Programmierers - also kaufen! - unabhängig von anderen möglichen Büchern
  9. Sofus

    3 Schichten Modell

    Deine Package-Namen enthalten nicht nur Großbuchstaben, sondern sind auch viel zu kurz geraten. Die Java Sprachspezifikation verlangt hier eindeutige Package-Namen, so das rein theoretisch aller jemals in Java geschriebener Code in einem einzigen jar-Archiv zusammen gefasst werden könnte ohne Dopplungen zu haben. Daher die Empfehlung von Sun den umgekehrten Internetdomänennamen als Package-Namen zu verwenden. Beispiele hierfür sind: org.w3c com.sun Du könntest zum Beispiel, um mit der Eindeutigkeit nicht zu übertreiben, folgend Package-Namen für dein GUI Package verwenden: de.the_macuser.minesweeper.gui Aber das eigentlich nur nebenbei Was dein Problem bei dem Softwareentwurf betrifft, habe ich den Verdacht, dass du das Ganze von der völlig falschen Seite angegangen hast. Versuch doch erstmal eine Klasse (oder mehrere) zu schreiben die das Konzept das Spiels repräsentieren ohne auch nur den Ansatz einer Oberfläche zu verwenden (System.out eingeschlossen). Hier mein Vorschlag für eine Klasse MinesweeperFeld: Der Konstruktor erstellt ein Feld der vorgegebenen Breite und Höhe mit zufällig in dem Feld verteilten Minen gleich der übergebenen Anzahl von Minen. Nicht vergessen auch die für Minesweeper typischen Hilfszahlen zum Lösen in das Feld einzutragen. public MinesweeperFeld(int breite, int höhe, int anzahlMinen) { ... } Hier ein paar sondierende Methoden: public int gibBreite() { ... } public int gibHöhe() { ... } public int gibMinenAnzahl() { ... } Und zu guter letzt eine Methode, mit deren Hilfe man den Inhalt des Feldes für beliebige Oberflächen abfragen kann. Die Rückgabewerte bei int wären dann -1 für eine Mine, 0 für ein freies Feld und 1 bis 8 für die Hilfszahlen. public int gibFeld(int breite, int höhe) { ... }
  10. Da hast du natürlich vollkommen Recht, allerdings ist Java eine objektorientierte Sprache, und da wäre es doch schöner auch objektorientiert zu programmieren. Ich will dich nicht verbessern, aber ich würde gerne zeigen wie man mein Objekt mit deinem Code verbindet. Wir haben also eine zweite Klasse Main mit einer public static void main(String[] args) Methode (unser Programm, in dem wir unser Objekt Rechnung benutzen). Ersten Wert eingeben: meineRechnung = new Rechnung(ersterWert) do { Rechenzeichen eingeben. Zweiten Wert eingeben. Rechenzeichen in If-Bedingung überprüfen: z.B.: meineRechnung.addieren(zweiterWert) Ausgeben des Ergebnisses: System.out.println("Teil-Ergebnis: " +meineRechnung.gibErgebnis()); } while(so lange der Benutzer will); Jetzt kann man folgende Ausdrücke auflösen (3 + 4) * 2 / 8 und andere natürlich . Für jede neue Rechnung müsste man aber das Programm dann neu starten.
  11. Ich kann schlecht abschätzen wie vertraut du mit Java bist, da du hierzu recht wenige Angaben gemacht hast, aber für den Anfang würde ich vielleicht erstmal ein Objekt Rechnung schreiben mit den Methoden: public void addieren(int zahl) { ... } public void subtrahieren(int zahl) { ... } public void multiplizieren(int zahl) { ... } public void dividieren(int zahl) { ... } public int gibErgebnis() { ... } Der Konstruktor könnte folgendermaßen aussehen: public Rechnung(int intialwert) { ... } Am besten aber ohne eine Main-Methode, da man schon von Anfang an lernen sollte zwischen Objekten und dem Programm an sich zu trennen. Viel interessanter, gerade für Programmieranfänger, ist es dem selbst geschriebenen Objekt mit BlueJ leben ein zu hauchen.
  12. Eigentlich beschreibt die Exception sehr schön wo dein Fehler liegt, nämlich dass das was du in die Datei reinschreibst nicht dem entspricht was du aus der Datei auslesen möchtest. Laut JavaDoc wird StreamCorruptedException immer dann geworfen wenn die Kontrollinformation für readObject nicht den KonsistenzCheck bestehen - sprich falsch sind.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...