generischen Sammlung

domme1987du

Mitglied
Hi,
also irgendwie komme ich nicht weiter ...

Ich habe 3 Klassen (Medium abstrakt, Bild (erbt von Medium), Audio (erbt von Medium)).

Medium
Java:
import java.time.LocalDate;
public abstract class Medium
{
   protected int id;
   private static int count;
   protected String titel;
   protected int jahr;

   protected int getId()
   {
     id = count;
     count++;
    
     return id;
   }

   protected String getTitel()
   {
     return titel;
   }

   protected void setTitel(String titel)
   {
     this.titel = titel;
   }

   protected int getJahr()
   {
     return jahr;
   }

   protected void setJahr(int jahr)
   {
     this.jahr = jahr;
   }

   public Medium()
   {
     this.id = count;
   }
  
   public int alter()
   {
     int alter;
     LocalDate jetzt = LocalDate.now();
     alter = jetzt.getYear() - jahr;
     return alter;
   }
  
   public abstract void druckeDaten();
  


}

Audio
Java:
public class Audio extends Medium
{
   String interpret;
   int dauer;

   public String getInterpret() {
     return interpret;
   }
   public void setInterpret(String interpret) {
     this.interpret = interpret;
   }
   public int getDauer() {
     return dauer;
   }
   public void setDauer(int dauer) {
     this.dauer = dauer;
   }
  
   public Audio()
   {
    
   }
   public Audio(String titel, String interpret, int jahr, int dauer)
   {
     super();
     this.titel = titel;
     this.interpret = interpret;
     this.jahr = jahr;
     this.dauer = dauer;  
   }
   public void druckeDaten()
   {
     System.out.println("ID = " +getId()+ '"' +titel+ '"' +" von " +interpret+
         " aus " +jahr+ " Spieldauer: " +dauer);
     //System.out.println('"' +titel+ '"' +" ist " +alter()+ " Jahre alt");
   }

}

Bild
Java:
public class Bild extends Medium
{
   String ort;

   public String getOrt() {
     return ort;
   }
   public void setOrt(String ort) {
     this.ort = ort;
   }
  
   public Bild()
   {
    
   }
   public Bild(String titel, int jahr, String ort)
   {
     super();    
     this.titel = titel;
     this.jahr = jahr;
     this.ort = ort;
    
   }
   public void druckeDaten()
   {
     System.out.println("ID = " +getId()+ '"' +titel+ '"' +" aufgenommen im Jahr " +jahr+ " in " +ort);
   }

}

Jetzt soll ich eine 4.te erstellen Medienverwaltung mit den Methoden aufnehmen, zeigeMedien, sucheNeuesMedium, berechneErscheinungsjahr.

Java:
import java.util.*;
public class Medienverwaltung
{
   public Medienverwaltung()
   {
    
   }
  
   public static void aufnehmen()
   {      
     int anzBild = 10;
     int anzAudio = 10;
  
     Bild bilder[] = new Bild[anzBild];
     Audio audio[] = new Audio[anzAudio];
    
     bilder[0] = new Bild("Informatik", 2006, "Duisburg");
     bilder[1] = new Bild("Gebaeude FB Informatik", 2014, "Dortmund");
     audio[0] = new Audio("Nothing", "Stereophonics", 2001, 301);
     audio[1] = new Audio("Nothing else matters", "Bon Jovi", 1995, 296);
    
     bilder[0].druckeDaten();
     bilder[1].druckeDaten();
     audio[0].druckeDaten();
     audio[1].druckeDaten();
   }
  
   public static void zeigeMedien() //
   {
     System.out.println("!!! Alle Medien !!!");
/*     for(int i = 0; i < 2; i++)
     {
      
     }
*/    
   }
  
   public static void main(String[] args)
   {  
     aufnehmen();
     zeigeMedien();
   }
   public void druckeDaten()
   {
    
   }

}

Das ist die Aufgabe:
Mit der Methode aufnehmen wird ein neues Medium in die Medienverwaltung
aufgenommen. Das neueMedium wird als Parameter übergeben.
(
DieMedien werden in einer typsicheren (generischen) Collection verwaltet. Verwenden
Sie in der Klasse Medienverwaltung mindestens einen (typisierten) Iterator
und eine erweiterte for-Schleife (für Sammlungen).
).

Mein problem besteht darin, das Audio und Bild eine unterschiedliche Parameterlänge haben und ich nicht weiss wie genau aus der Main Mehthode in die Methode Aufnehmen kommen soll und dabei entweder ein neues Bild oder ein neues Audio-Objekt als parameter übergeben kann.

Ich hoffe die Frage ist verständlich für euch und jemand kann mir da weiterhelfen .

grüße
Dominik
 
Zuletzt bearbeitet von einem Moderator:

Joose

Top Contributor
Du hast es ja schon geschrieben, die Methode "aufnehmen" nimmt das neue Medium auf und bekommt als Parameter ein Medium(objekt) übergeben.
Java:
public void aufnehmen(Medium neuesMedium) {
    dieMediumListe.add(neuesMedium);
}
....
aufnehmen(new Audio("Nothing else matters", "Bon Jovi", 1995, 296));
 

Flown

Administrator
Mitarbeiter
Deine Medium::getId Methode ist falsch. Weise deiner id den aktuellen count hinzu und inkrementiere diesen im Konstruktor und nicht in der Methode!
 

domme1987du

Mitglied
Du hast es ja schon geschrieben, die Methode "aufnehmen" nimmt das neue Medium auf und bekommt als Parameter ein Medium(objekt) übergeben.
Java:
public void aufnehmen(Medium neuesMedium) {
    dieMediumListe.add(neuesMedium);
}
....
aufnehmen(new Audio("Nothing else matters", "Bon Jovi", 1995, 296));

Dann muss ich noch eine ArrayList (oder welche ist besser) machen für Medium oder ?
Damit ich einen Array von medium habe wo Audio und Bild drin sind.
 

domme1987du

Mitglied
Deine Medium::getId Methode ist falsch. Weise deiner id den aktuellen count hinzu und inkrementiere diesen im Konstruktor und nicht in der Methode!

Wenn ich das
Java:
  public Medium()
   {
     this.id = count;
     count++;
   }
schreibe, dann bekomme ich doch immer nur den letzten Wert zurück.
 
Zuletzt bearbeitet von einem Moderator:

Joose

Top Contributor
Ja eine ArrayList wirst du brauchen. (ob du eine andere Liste/Collection verwendest bleibt dir überlassen und kommt ganz auf den Anwendungsfall an)
Du hast dann kein Array sondern eine Liste ;)

schreibe, dann bekomme ich doch immer nur den letzten Wert zurück.
So weist du jedem neu erstellten Medium eine id einmalig zu. Bei deiner alten Variante hast der Code dafür gesorgt das bei jedem Aufruf von "getId" dem Medium eine neue Id zugewiesen wird.
 

domme1987du

Mitglied
Und wie kann ich dann überprüfen ob das mit der "getId" und "mediumListe" alles auch richtig ist ? (bestimmt ne newbee frage aber steh grad aufm Schlauch xD
(ist eben einfach nur ne neu erzeugte Mehthode , würde das dann später umschreiben, wenn es alles funktioniert xD)

Java:
  public static void aufnehmen1(Medium medium)
   {
     ArrayList<Medium> mediumListe = new ArrayList<Medium>();
     mediumListe.add(medium);
   }
 
Zuletzt bearbeitet von einem Moderator:

Flown

Administrator
Mitarbeiter
Also deine getId Methode ist fehlerhaft. Versuch doch mal ein Audio-Objekt anzulegen und dann zweimal hintereinander getId und druckedaten aufzurufen. Wie du bemerken wirst, ändert sich die id.
 

Joose

Top Contributor
Und wie kann ich dann überprüfen ob das mit der "getId" und "mediumListe" alles auch richtig ist ? (bestimmt ne newbee frage aber steh grad aufm Schlauch xD

Zuerst mal: Hier werden 2 unterschiedliche Probleme besprochen ;), dein eigentliches Problem war die Mediumverwaltung.
Es hat keinen Sinn immer eine neue Liste in der Methode "aufnehmen" zu erstellen. Dadurch hat deine Liste immer nur ein Medium als Inhalt, und die Liste ist auch nicht in den anderen Methoden verfügbar. Diese Liste sollte eine Instanzvariable von Mediumverwaltung sein und eben nur 1x erstellt werden.

Java:
public class Medienverwaltung {
    private ArrayList<Medium> medien;
    public Medienverwaltung() {
        medien = new ArrayList<>();
    }
..

(Anmerkung die Methode "aufnehmen" musst nicht statisch sein).

Zu dem Problem mit "getId" hat dir Flown eh schon geschrieben.
 

domme1987du

Mitglied
Wenn ich "aufnehmen" nicht static mache , sagt der mir geht nicht weil nicht static xD

mit getId, beschäftige ich mich dann gleich xD
 
Zuletzt bearbeitet:

Joose

Top Contributor
Was hast du denn geändert? Wie schaut der Code nun aus?

Bitte Code in Code-Tags packen, danke ;)
[code=java] .. dein code ... [/code]
 

domme1987du

Mitglied
Java:
public class Medienverwaltung
{
  private ArrayList<Medium> medien;
...

  public void aufnehmen1(Medium medium)
   {
     medien.add(medium);
   }

  public static void main(String[] args)
   { 
     aufnehmen();
     zeigeMedien();
   
     aufnehmen1(new Audio("Nothing else maeaaaaaaaaaaaaaaaaatters", "Bon Jovi", 1995, 296));
   }
da kommt der fehler : Cannot make a static reference to the non-static method aufnehmen1(Medium) from the type Medienverwaltung
 

Joose

Top Contributor
... das der Aufruf der methode aufnehmen direkt mit den parametern sein soll ?
So wie es jetzt ist ?
Das kann ich aus der Fragestellung nicht rauslesen. Ich kann nur erkennen das es eine Klasse "Medienverwaltung" geben soll, welche eine Methode "aufnehmen" anbietet. Diese Methode kann als Parameter ein Medium Objekt bekommen.

PS: Wenn die Aufgabenstellung nicht klar ist solltest du dich an den Aufgabensteller wenden, der wird dir es am genauersten erklären können.
 

domme1987du

Mitglied
Ich muss nochmal stören, hab jetzt hin und her probiert ...
So sieht meine Klasse Medienverwaltung nun aus
Java:
  private static ArrayList<Medium> medien;
  private ArrayList<Audio> audio;
  private ArrayList<Bild> bild;
  
   public Medienverwaltung()
   {
     medien = new ArrayList<>();
   }
   public static void main(String[] args)
   {  
     Audio audio = new Audio();
    
     audio = new Audio("Nothinaaaaaaaaaaaaaaaaaaaaaaag", "Stereophonics", 2001, 301);
    
     aufnehmen(audio);
    
   }
   public static void aufnehmen(Medium medium)
   {
     medien.add(medium);
     System.out.println(medien);
   }  
   public static void zeigeMedien() //
   {
     System.out.println("!!! Alle Medien !!!");
/*     for(int i = 0; i < 2; i++)
     {
      
     }
*/    
   }
   public void druckeDaten()
   {
    
   }

}

Und diese Fehlermedlung kommt nun :
Exception in thread "main" java.lang.NullPointerException
at Medienverwaltung.aufnehmen(Medienverwaltung.java:23)
at Medienverwaltung.main(Medienverwaltung.java:18)

Kannst du mir da grad nochmal helfen xD
 
Zuletzt bearbeitet von einem Moderator:

Joose

Top Contributor
Nochmal der Hinweis: Bitte schreibe deinen Code in Code-Tags und nicht als Zitat!
[code=java] ... dein code ... [/code]


Die ArrayList "medien" wird erst im Konstruktor von Medienverwaltung initialisiert, diesen Konstruktor rufst du aber nie auf.
Wie oben schon geschrieben: Lass einfach das static weg (bei der Methode "aufnehmen" und bei der Liste "medien"), und erstelle stattdessen einfach eine Objekt deiner Klasse Medienverwaltung in der main-Methode und rufe dann von diesem Objekt die Methode "aufnehmen" auf.
 

domme1987du

Mitglied
Erstmal vielen vielen dank ;-)

Hab das jetzt in der main so :
Java:
    audio = new Audio("Nothinaaaaaaaaaaaaaaaaaaaaaaag", "Stereophonics", 2001, 301);
     neuesMed.aufnehmen(audio);
und in aufnehmen :
Java:
     medien.add(medium);
Klappt wunderbar, hab das static auch weggemacht, aber die

wie kann ich danachvon der main in eine Methode "zeigeMedien" um dort z.b. alle vorhanden Medien auszulesen ?
Java:
  public void zeigeMedien() //
   {
     System.out.println("!!! Alle Medien !!!");
     for(int i = 0; i<medien.size(); i++)
     {
       System.out.print(medien.get(i));      
     }
   }

das geht nicht, kommt als Ausgabe : Audio@2a139a55
 

Joose

Top Contributor
Stimmt doch schon so wie du es implementiert hast ;)

System.out.print() nimmt ein Objekt entgegen und ruft von diesem Objekt die "toString()" Methode auf. Sofern diese Methode von deiner Klasse nicht überschrieben wird, wird die Default Variante der Klasse Object ausgeführt, welche eben diese Ausgabe erzeugt.
Lösung -> du musst die toString() Methode überschreiben.
 

domme1987du

Mitglied
Und wie kann ich die überschreiben ?

Ich dachte meine "toString" Methode ist die "druckeDaten()" , hab ich grad nen denkfehler oder muss ich ne neue Methode schreiben "toString" die dann in jeder klasse enthalten sein muss oder nur in der "Medienverwaltung" ?

In Medienverwaltung:
Java:
public String toString()
   {
     System.out.println("ID = " +getId()+ '"' +titel+ '"' +" von " +interpret+
         " aus " +jahr+ " Spieldauer: " +dauer);
     return null;
     
   }

Wie kann ich ie nun ämndern, das ich an die Daten komme oder hab ich da gerade nen Denkfehler ?
 
Zuletzt bearbeitet:

VfL_Freak

Top Contributor
Moin,

dass ist Adresse des in i enthaltenen Objekts medium

Du musst schon die einzelnen Attribute über Deine getter und Setter ansprechen!

Gruß Klaus
 

domme1987du

Mitglied
hab das soweit hinbekommen
Aber könnt ihr mir gerade sagen, was diese Fehlermedlung sagt ?:

Exception in thread "main" java.lang.NullPointerException
at java.io.Writer.write(Unknown Source)
at java.io.PrintStream.write(Unknown Source)
at java.io.PrintStream.print(Unknown Source)
at Medienverwaltung.zeigeMedien(Medienverwaltung.java:35)
at Medienverwaltung.main(Medienverwaltung.java:21)

tritt hier auf
Java:
  public void zeigeMedien() //
   {
/*     System.out.println("!!! Alle Medien !!!");
     for(int i = 0; i<medien.size(); i++)
     {
       System.out.print(medien.get(i));       
     }
*/   }
[/quote]
 

domme1987du

Mitglied
habs ...
Java:
  public void zeigeMedien() //
   {
     System.out.println("!!! Alle Medien !!!");
     for(int i = 0; i<medien.size(); i++)
     {
       System.out.print(medien.toString());     
     }
   }
Ausgabe :
!!! Alle Medien !!!
ID = 2"Nothinaaaaaaaaaaaaaaaaaaaaaaag" von Stereophonics aus 2001 Spieldauer: 301
[null]
Aber jetzt kommt am Ende [NULL]

und warum ist id = 2 ??
Da ist doch nur 1 Objekt oder :
Java:
  public static void main(String[] args)
   {   
     Medienverwaltung neuesMed = new Medienverwaltung();
     
     
     Audio audio = new Audio();
     
     audio = new Audio("Nothinaaaaaaaaaaaaaaaaaaaaaaag", "Stereophonics", 2001, 301);
     neuesMed.aufnehmen(audio);
     neuesMed.zeigeMedien();
     
   }
 

Joose

Top Contributor
und warum ist id = 2 ??
Da ist doch nur 1 Objekt oder :
Java:
     Audio audio = new Audio();
     audio = new Audio("Nothinaaaaaaaaaaaaaaaaaaaaaaag", "Stereophonics", 2001, 301);
     neuesMed.aufnehmen(audio);
     neuesMed.zeigeMedien();

Du erstellst 2 Audio Objekte, mit dem 1. machst du nichts, und das 2. fügst du deiner Verwaltung hinzu.
Java:
  public void zeigeMedien() //
   {
     System.out.println("!!! Alle Medien !!!");
     for(int i = 0; i<medien.size(); i++)
     {
       System.out.print(medien.toString());    
     }
   }
Ausgabe :

Aber jetzt kommt am Ende [NULL]

Du iterierst über deine Liste, gibst aber in der Schleife immer die ganze Liste aus ;)
Du solltest wie von Vfl_Freak schon angesprochen auf das entsprechende Element zugreifen und von diesem die "toString()" Methode aufrufen.

Den Fehler kannst du wunderbar sehen indem du einfach ein weiteres Medium erzeugst und deiner Verwaltung hinzufügst ;)
 

JStein52

Top Contributor
Aber jetzt kommt am Ende [NULL]
Nur noch mal zur Erklärung dieser "komischen" Ausgabe. Falls deine toString() noch so ist wie oben gepostet gibt sie als erstes mal via println(...) etwas aus. Und dann liefert sie "null" zurück, und zwar an die Stelle in zeigeMedien() wo sie ebenfalls in einem println() aufgerufen wird. Und deshalb wird dieses [NULL] ausgegeben.
 

Ähnliche Java Themen

Neue Themen


Oben