[MW] Aufgabe 1, Orientierung

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

[MW] Aufgabe 1, Orientierung
Hi,
ich weiß, bin a bissl spät dran, war die letzten Tage gut ausgelastet. Sind ja noch 23 Stunden bis zur Abgabe…

Nun hab ich also wieder das übliche Problem, jedes Mal, wenn ich so eine Java-Übungsaufgabe machen soll, steht ich zuerst mal etwas hilflos da. Vor lauter Interfaces und Klassenbeschreibungen weiß ich momentan gar nicht so recht, was ich eigentlich wohin implementieren soll.

Ganz am Ende steht (ich mach jetzt einfach mal Top-Down-Entwicklung) dass man eine Art Shell machen soll, wo der Benutzer Befehle eingibt. Soll das dann die main-Methode sein? Kommt die in eine eigene Klasse oder LibraryFrontend?

Diese Schnittstellenklasse LibraryFrontend ist mir ein wenig suspekt. Die steht da einfach so im Raum und soll verbinden. Möglichst den Benutzer mit der Datenbank. Wo auch immer beide stehen. Soll jetzt main() eine Instanz von LibraryFrontend erzeugen, das wiederum eine Memberinstanz von SimpleDBImpl enthält? Das erweckt bei mir zwar einen etwas unsauberen Eindruck, wäre aber mein bester Vorschlag, der tatsächlich funktionieren könnte.

Dann soll die Datenbank Objekte registrieren können, allerdings weiß ich mit der vorgegebenen Methodensignatur nichts anzufangen. Ist LibraryFrontend.registerItem, Parameter classname der interne Klassenname, wie “Book” oder “CD”, als Zeichenkette formuliert? Was bringt mir das dann? (Sorry, mit Reflection-APIs hab ich’s nicht so sehr, bin diesbzgl. eher ein C-Affe.) Und welche Bedeutung hat dann der title-Parameter? Das kann ich nirgends in der Aufgabe finden. Ich kann nur vermuten, dass der Titel allein global eindeutig ist, ist das korrekt? Welche Daten soll ich denn als Schlüssel in der Datenbank verwenden? [Den Titel]

Außerdem hoffe ich, dass es ok ist, wenn ich ein Eclipse-Projekt abgebe, Java kann ich nur in Eclipse. Was anderes kenn ich nicht (innerhalb der restlichen Zeit).


Hi,

habe leider gerade nicht viel Zeit, deshalb nur kurz: Ich habe eigentlich alles so gemacht, wie du es beschrieben hast. Du hast Recht, es ist teilweise nicht genau genug spezifiziert, aber da hat man dann halt Freiheiten.

Und main() kommt in LibraryFrontend meiner Meinung nach.

Und uebrigens glaube ich, dass das Abgabeskript bis 23:59 annimmt, aber ohne Gewaehr!


Ne, Abgabe ist Donnerstag um 20 Uhr (Quelle1, Quelle2: Aufgabenzettel)

Ok, dann werd ich mich mal so durchwurschteln. Mal sehen, was es zum Schluss wird.

Frage zu Exceptions/Errors
Hallo,
ich brauch als Anfänger Hilfe: Es gelang mir folgende Interaktion mit der “Datenbankshell” aufzuzeichnen:

>register boog DieEntdeckungDerLangsamkeit
java.lang.ClassNotFoundException: boog register

Wunderbar, so soll es sein. Die Klasse “boog” gibt’s in der Datenbank nicht.
Ich interagierte also weiter:

>register book DieAbenteuerEinesMoralisten java.lang.NoClassDefFoundError: book (wrong name: Book) at java.lang.ClassLoader.defineClass0(Native Method) (...)
es folgen viele weitere Zeilen mit Fehlermeldungen und die virtual maschine verabschiedet sich…
Aber warum tut sie das? :vogel:
⇒Warum löst ein kleingeschriebener Klassenname einen Laufzeitfehler aus und ein nicht existierender Klassenname wird “gecatched”? Nun der praktische Teil meiner Frage:
⇒Wie kann ich der “Datenbank” abgewöhnen zwischen verschieden Falschschreibungen zu unterscheiden?

P.S. >register Book DieAbenteuerEinesMoralisten funktioniert natürlich.


@Yves:

./abgabe aufgabe1

[...]

Der Abgabetermin ist: 23:59, 3.11.2005.
Alle nötigen Dateien vorhanden.

Wie gesagt, verlassen wuerde ich mich nicht darauf.

@Maesius: Die Loesung dieses Raetsels wuerde mich auch brennend interessieren…


Wie kann man aus einem String eine Klasse erzeugen???

Ich hab einfach ein if else Konstrukt für die drei Fälle gebaut und umgehe das Problem mit der Groß/Klein Schreibung über String.compareToIgnoreCase(String). Bei 0 sind sie identisch und sonst kommt irgendein Wortabstand zurück, damit man sie alphabetisch ordnen kann. So kann man sehen welcher String am nächsten zur Eingabe ist, um eine gewisse Fehlertoleranz zu erzielen, was aber auch bei völlig sinnlosen Eingaben zu einem sinnvollen Ergebniss führen würde.


Das geht mit class.forName () und heisst dynamisches Klassenladen. Mehr dazu auf den Uebungsfolien zur 1. Uebung.


Hm, hab ich wohl eine der 90 Folien überlesen …

Ich halte diese Methode aber nicht für sinnvoll, da

  1. Drei Klassen noch gut überschaubar sind und anders eine gewisse Toleranz zur Benutzereingabe einfach zu verwirklichen ist.

  2. ab Aufgabe 2.b) durch die Umorganisation der Packages der Benutzer entweder wissen muss in welchem Package die Klasse liegt und diese mit angeben muss, oder nur Klassen aus einem Package verwendet werden können.


Ich denke schon, dass es sinnvoll ist, wenn man die Bibliothek erweitern moechte. So kann man ohne Umschreiben der Applikationen ploetzlich DVDs hinzufuegen, indem man die Klasse von Item ableitet…


Sagt mal, ist das normal, dass man gewisse Exceptions trotz try+catch nicht abfangen kann?

try {
	Class c = Class.forName(classname);
	// ...
} catch (Exception ex) {
	System.err.println("Ungültiger Klassenname");
}

Führt zur unhandled exception “java.lang.NoClassDefFoundError” hier in Zeile 2. Ist das keine Exception? Sollte ich besser ein “Throwable” catchen statt einer “Exception”? Wozu bitte ein try-Block, wenn ich doch rausfliege? Dummes Zeug… :rolleyes: Alle anderen Exceptions gehen ja auch.


weiß ned, was ihr nur alle macht - bei mir läuft das astrein und wirft auch nur die geforderte exception

try{
			Class newClass = Class.forName(classname);
			Object o = newClass.newInstance();
			Item item = (Item) o;
                        /* ... */
}
		catch(ClassNotFoundException e){
			System.out.println("Mediumstyp unbekannt");			
		}