aus einem einzeiligen String ein neues Objekt erstellen

  • Themenstarter Themenstarter donmugello
  • Beginndatum Beginndatum
D

donmugello

Gast
Hallo liebe Community,

ich stecke gerade mitten in einem Programmierpraktikum und habe ein Problem bei einer Aufgabe, auf dessen Lösung ich einfach nicht komme. Ich habe die Aufgabe komplett implementiert, Eclipse zeigt keine Fehler an, aber eine Methode funktioniert beim testen nicht so wie sie soll.

Erstmal zur Aufgabe:

Wir sollen eine Bibliothek erstellen, in der Benutzer und Medien gespeichert werden. Die Benutzer und Medien werden in separaten Klassen erstellt, in einer Klasse Bibliothek zusammengeführt und dort wird mit Ihnen gearbeitet. Die Methode, die bei mir nicht funktioniert, existiert in der Klasse Bibliothek soll aus einem einzeiligen String ein neues Medium herauslesen und erstellen. Hier mal die genaue Aufgabenstellung:

static Medium readMedium(String line)
Liest aus einem einzeiligen String ein neues Medium ein und gibt dies zurück. In diesem String sind jeweils durch Komma getrennt folgenden Informationen enthalten:
Der erste Eintrag gibt stets den Typ des Mediums an, also "CD", "DVD" oder "Buch". Der zweite Eintrag gibt stets die Registriernummer an, der dritte den Titel, der vierte die Information, ob das Medium ausleihbar ist ("true" oder "false"). Bei einem Buch folgen anschlieüend ISBN-Nummer, Autor und Mindestalter, bei einer CD oder DVD die Abspieldauer und das Mindestalter. Ist der übergebene String nicht diesen Anforderungen entsprechend formattiert oder enthült er weitere durch Komma separierte Elemente, so ist eine IllegalArgumenException zu werfen.
Ein korrekter String kann zum Beispiel wie folgt aussehen:
Buch,104,Terry Schotter,true,ISBN:12345,A. Rollin,12
oder:
CD,101,Musik der Stille,true,34,6

Die Medien werden über Unterklassen eingeteilt, in Buch, CD und DVD.

Mein Code für diese Methode sieht folgendermaßen aus:

Java:
static Medium readMedium(String line) {
		int regNr, mindAlt, abspd;
		boolean alb;
		String[] a = line.split( Pattern.quote( "," ) );
		if (a.length < 6 ||a.length > 7)
			throw new IllegalArgumentException();
		try {
			regNr = Integer.parseInt(a[1]);
			mindAlt = Integer.parseInt(a[a.length-1]);
			alb = Boolean.parseBoolean(a[3]);
		} catch (NumberFormatException nfe) {
			throw new IllegalArgumentException();
		}
		if (a[0] == "Buch" && a[4].substring(1,6) == "ISBN:") {
			Medium med = new Buch(regNr, a[2], alb, a[4], a[5], mindAlt);
			return med;
		} else
			if (a[0] == "CD" || a[0] == "DVD") {
				try {
					abspd = Integer.parseInt(a[4]);
				} catch (NumberFormatException nfe) {
					throw new IllegalArgumentException();
				}
				if (a[0] == "CD") {
					Medium med = new CD(regNr, a[2], alb, abspd, mindAlt);
					return med;
				}
				if (a[0] == "DVD") {
					Medium med = new DVD(regNr, a[2], alb, abspd, mindAlt);
					return med;
				}
			} throw new IllegalArgumentException();
	}

Mein Problem ist nun, dass wenn ich einen der beiden Beispielstrings einfüge und teste, die Methode dennoch komplett durchläuft und mir eine IllegalArgumentException zurückgibt. Allerdings sollte doch meines Wissens die Methode beendet werden, sobald in einer if-Bediungung ein neues Medium erzeugt und zurückgegeben wurde. Sehe ich da etwas falsch oder habe ich einen Fehler in meinem Code, den ich immer und immer wieder übersehe?

Was evtl noch wichtig ist: meine Methode, ein neues Medium zu erstellen sieht zb für ein buch folgendermaßen aus:

Java:
public Buch(int registernummer, String titel, boolean ausleihbar, String iSBN, String autor, int mindestalter) {
		super(registernummer, titel, ausleihbar, mindestalter);
		if (titel == null || autor == null || iSBN == null)
			throw new NullPointerException();
		if (titel == "" || autor == "" || iSBN == "" || registernummer < 0)
			throw new IllegalArgumentException();
		this.iSBN = iSBN;
		this.autor = autor;
	}

Hat jemand vielleicht einen Tipp für mich, woran es liegen könnte? Für ein bisschen Hilfe wäre ich sehr dankbar.


MfG Thomas
 
String vergleicht man nicht mit
Code:
s1==s2
, sondern mit
Code:
s1.equals(s2)
Außerdem bei solchen Sachen schreibt man in jede Zeile eben ein Sysout (z.B. "Parameter anzahl ok", "Versuch zum Int zu parsen", "Parsen erfolgreich" etc), dann sieht man auch, wo der Fehler ist
 
Das hier ist auch fragwürdig:
Java:
catch (NumberFormatException nfe) {
    throw new IllegalArgumentException();
}
 
inwiefern denn fragwürdig?

ich hatte gehofft, die zeilen wandeln eine eventuelle Number Format Exception in eine Illegal Argument Exception um, da wir diese lt Aufgabenstellung benötigen.

kann denn parseInt noch andere Exceptions bringen? bzw würde ich das problem lösen, indem ich schreibe:

Java:
catch (Exception e) {
			throw new IllegalArgumentException();
		}

oder sammelt Exception e nicht alle ankommenden Exceptions und wandelt diese um? Das würde mir einiges erleichtern...
 

Neue Themen


Zurück
Oben