OOP Problem mit Array

Nemesys88

Bekanntes Mitglied
Hallo!

Habe 2 Klassen, die Buch und Daten heissen. Die Klasse Buch spiegelt eigentlich ein struct wieder, mit Settern und Gettern für die Attribute. Die Klasse Daten soll jetzt auf diese Buch-Klasse zugreifen können

Erstmal Quellcode (es gehören noch 4 weitere Klassen zum kompletten Programm):

Klasse Buch:

Java:
/**
 * 
 * TODO Add comment here
 *
 * @author $Author:  $
 * @version $Revision:  $, $Date:  $ UTC
 */
public class Buch   
{
   protected String Autor;
   protected String Titel;
   protected String Verlagsname;
   protected int Erscheinungsjahr;
   protected String Erscheinungsort;
   protected String ISBN;
 
  /**
   * 
   * TODO Add constructor comment here
   *
   */
  Buch()    
  { 

  }
 
  public void setAutor(String _Autor)
  {
      this.Autor = _Autor;
  }
 
  public String getAutor()
  {
     return Autor;
  }
 
  public void setTitel(String _Titel)
  {
      this.Titel = _Titel;
   }
 
  public String getTitel()
  {
      return Titel;
  }
 
  public void setVerlagsname(String _Verlagsname)
  {
      this.Verlagsname = _Verlagsname;
  }
 
  public String getVerlagsname()
  {
      return Verlagsname;
  }
 
  public void setErscheinungsjahr(int _Erscheinungsjahr)
  {
      this.Erscheinungsjahr = _Erscheinungsjahr;
  }
 
  public int getErscheinungsjahr()
  {
      return Erscheinungsjahr;
  }
  
  public void setErscheinungsort(String _Erscheinungsort)
  {
      this.Autor = _Erscheinungsort;
  }
 
  public String getErscheinungsort()
  {
     return Erscheinungsort;
  }
  
  public void setISBN(String ISBN)
  {
      this.Autor = ISBN;
  }
 
  public String getISBN()
  {
     return ISBN;
  }
  
}

Klasse Daten:

Java:
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;


/**
 * 
 * TODO Add comment here
 *
 * @author $Author:  $
 * @version $Revision:  $, $Date:  $ UTC
 */
public class Daten
{  
   Buch[] Bucharray = new Buch[100];
   Index[] Indexarray = new Index[100];
   
   /**
    * 
    * TODO Add constructor comment here
    *
    */
   public Daten()
   {
      
   }
   

   public void fill()
   {   
            Bucharray[0].setAutor("Schröder");
            Bucharray[0].setErscheinungsjahr(1994);
            Bucharray[0].setErscheinungsort("Texas");
            Bucharray[0].setISBN("12345");
            Bucharray[0].setTitel("Datenbanken");
            Bucharray[0].setVerlagsname("Bertelsfrau");  
   }
   
   public void create()
   {
      Writer fw = null;

      try
      {
        fw = new FileWriter( "Buch.txt" );
        
        for (int i=0;i<10;i++)
        {
           fw.write(Bucharray[i].getAutor());
           fw.write(Bucharray[i].getErscheinungsjahr());
           fw.write(Bucharray[i].getErscheinungsort());
           fw.write(Bucharray[i].getISBN());
           fw.write(Bucharray[i].getTitel());
           fw.write(Bucharray[i].getVerlagsname());     
        }
        fw.append( System.getProperty("line.separator") ); // e.g. "\n"
      }
      catch ( IOException e ) {
        System.err.println( "Konnte Datei nicht erstellen" );
      }
      finally {
        if ( fw != null )
          try { fw.close(); } catch ( IOException e ) { e.printStackTrace(); }
      }
      
   }
   
   public static void search()
   {
      
   }

}

Das Problem ist folgendes:

Er meckert an dieser Stelle: Bucharray[0].setAutor("Schröder");

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Daten.fill(Daten.java:31)

Was die Fehlermeldung besagt weiss ich, er zeigt auf ein Objekt dass null ist.
Aber das hilft mir nicht... und verstehen, wieso es an dieser Stelle null ist tue ich auch nicht.

Was muss ich tun, um das Problem zu beheben?
Wieso kann ich nicht in das Bucharray reinschreiben ?


Danke schonmal.

Gruß, Nemesys
 
Du hast mit
Java:
Buch[] Bucharray = new Buch[100];
nur ein Array der Klasse Buch mit 100 Elementen angelegt.
Aber die einzelnen Elemente sind noch null.
Bevor du
Java:
Bucharray[0].setAutor("Schröder");
machen kannst, musst du erst einmal ein neues Buch anlegen:
Java:
Bucharray[0] = new Buch();
Dann sollte es gehen...
 
Danke erstmal, das war schonmal hilfreich!

Es gibt aber noch Probleme beim Schreiben in die Datei...

Der aktuelle Code:

Java:
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;


/**
 * 
 * TODO Add comment here
 *
 * @author $Author:  $
 * @version $Revision:  $, $Date:  $ UTC
 */
public class Daten
{  
   static Buch[] Bucharray = new Buch[100];
   static Index[] Indexarray = new Index[100];
   
   /**
    * 
    * TODO Add constructor comment here
    *
    */
   public Daten()
   {

   }
   

   public static void fill()
   {   
      Bucharray[0] = new Buch();
      Bucharray[1] = new Buch();
      Bucharray[2] = new Buch();
      Bucharray[3] = new Buch();
      Bucharray[4] = new Buch();
      Bucharray[5] = new Buch();
      Bucharray[6] = new Buch();
      Bucharray[7] = new Buch();
      Bucharray[8] = new Buch();
      Bucharray[9] = new Buch();
      
      Bucharray[0].setAutor("Schröder");
      Bucharray[0].setErscheinungsjahr(1994);
      Bucharray[0].setErscheinungsort("Texas");
      Bucharray[0].setISBN("12345");
      Bucharray[0].setTitel("Datenbanken");
      Bucharray[0].setVerlagsname("Bertelsfrau");  
   }

   public static void create()
   {
      Writer fw = null;

      try
      {
        fw = new FileWriter( "Buch.txt" );
        
        for (int i=0;i<1;i++)
        {
           fw.write(Bucharray[i].getAutor());
           fw.write(Bucharray[i].getErscheinungsjahr());
           fw.write(Bucharray[i].getErscheinungsort());
           fw.write(Bucharray[i].getISBN());
           fw.write(Bucharray[i].getTitel());
           fw.write(Bucharray[i].getVerlagsname());     
        }
        fw.append( System.getProperty("line.separator") ); // e.g. "\n"
      }
      catch ( IOException e ) {
        System.err.println( "Konnte Datei nicht erstellen" );
      }
      finally {
        if ( fw != null )
          try { fw.close(); } catch ( IOException e ) { e.printStackTrace(); }
      }
      
   }
   
   public static void search()
   {
      
   }

}

Wenn ich das SO ausführe steht in der Buch.txt folgendes: 12345?

Die Exception wirft er bei

"fw.write(Bucharray.getErscheinungsort());"

Hab dann mal nur den Autor und das Erscheinungsjahr ausgeben wollen (und die andern 4 Attribute auskommentiert) da stand in der Buch.txt dies hier: Schröder?

Er kann also auch das Erscheinungsdatum nicht korrekt lesen...
 
Um das Erscheinungsjahr gescheit auszugeben, musst du es erst in einen String umwandeln:
Java:
fw.write(Integer.toString(Bucharray[i].getErscheinungsjahr()));

Das mit dem Erscheinungsort habe ich allerdings noch nicht durchschaut...
 
Okay, also

Java:
      Bucharray[0].setAutor("Schröder");
      Bucharray[0].setErscheinungsjahr(1994);
//      Bucharray[0].setErscheinungsort("Texas");
//      Bucharray[0].setISBN("12345");
//      Bucharray[0].setTitel("Datenbanken");
//      Bucharray[0].setVerlagsname("Bertelsfrau");  
   }

   public static void create()
   {
      Writer fw = null;

      try
      {
        fw = new FileWriter( "Buch.txt" );
        
        for (int i=0;i<1;i++)
        {
           fw.write(Bucharray[i].getAutor());
           fw.write(Integer.toString(Bucharray[i].getErscheinungsjahr()));
//           fw.write(Bucharray[i].getErscheinungsort());
//           fw.write(Bucharray[i].getISBN());
//           fw.write(Bucharray[i].getTitel());
//           fw.write(Bucharray[i].getVerlagsname());

gibt: Schröder1994 aus (das ist so schonmal richtig)...

Wenn ich
// Bucharray[0].setErscheinungsort("Texas"); und
// fw.write(Bucharray.getErscheinungsort());

jetzt wieder auskommentiere fliegen mir Exceptions um die Ohren:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.io.Writer.write(Writer.java:157)
at Daten.create(Daten.java:62)

usw.

Die Getter und Setter in der Buch.java sind aber ansich richtig...
Ich seh den Fehler grad nicht...
 
Du hast dich in deiner Klasse "Buch" verschrieben: In Zeile 69 füllst du
Java:
this.Autor = _Erscheinungsort;
statt
Java:
this.Erscheinungsort = _Erscheinungsort;
Dadurch ist dein Erscheinungsort immer noch null, und im Autor steht Mist.
Das ist dir bei der Methode setISBN übrigens auch passiert, dehalb war dein erster println auch "12345?".
 
Zuletzt bearbeitet:
Setter richtig.. oder auch nicht...

Ups...

Das passiert wenn man erst Copy & Paste benutzt um sich Schreibarbeit zu sparen, und es danach nicht gescheit anpasst... 😉

Vielen Dank!








Ich markier den Thread mal noch nicht als erledigt, falls noch irgendwas ist... 😀
 
Jetzt hab ich ein Problem mit einem Textfeld:

Java:
public class MainFrame extends JFrame implements ActionListener
{
   protected TextField tf = new TextField("", 30);
   
   MainFrame()
   {
      super("***** Programm für FB-Datenbank");

      // Make sure we have nice windows decorations.
      JFrame.setDefaultLookAndFeelDecorated(true);
      // Set up the window.
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
      // set up borderlayout
      setLayout(new BorderLayout());

      // adds Menu
      add(new Menu(this), BorderLayout.NORTH);  
     
      // add buttons 
      JButton button1;
      JButton button2;
      button1 = new JButton("Search Book");
      button2 = new JButton("Show Index");
      button1.addActionListener(this);
      button2.addActionListener(this);
      this.getContentPane().add(button1,BorderLayout.SOUTH);
      this.getContentPane().add(button2,BorderLayout.NORTH);
      this.getContentPane().add(tf,BorderLayout.CENTER);
      
      Daten.fill();
      Daten.create();
   }

   @Override
   public void actionPerformed(ActionEvent e)
   {
     String s = tf.getText();
     Daten.search(s);
     System.out.println(s);      
   }

}

Wenn ich das Programm ausführe und im Textfeld Mathe eingebe dann speichert er Mathe zwar in der Variablen s aber der Aufruf Daten.search(s) liefert nicht das richtige Ergebnis. Wenn ich manuell Daten.search("Mathe"); aufrufe funktioniert alles (das Ergebnis ist dann die Anzeige der Buchinformationen) - warum?
 
Was ist denn da jetzt bitte falsch?

System.out.println(s); gibt mir in der Konsole Mathe aus.

Wieso funktioniert Daten.search(s) dann nicht aber Daten.search("Mathe") funktioniert ??! :bahnhof:
 
Scheint ja nicht ganz sichtbar zu sein, warum das grad nicht geht sonst hätte ja schon wer geantwortet denk ich...

Die Funktion search ist in der Klasse Daten so definiert (vllt hilft das noch):

public static void search(String begriff)
{
...
}

Ich versteh halt echt nicht, wieso Daten.search("Mathe") funktioniert und Daten.search(s) nicht, wobei s ein String ist der den Wert "Mathe" hat. Ist schon ein bisschen paradox... :bahnhof:
 
Ohne jetzt genauer eingestiegen zu sein: Mir fällt auf, dass du AWT und Swing mischst, was man tunlichst vermeiden sollte. Mach mal aus deinem TextField ein JTextField und schau, was passiert.
Ansonsten ist es schwer nachzuvollziehen, ohne KSKB.
 
Dann poste doch mal bitte die Methode search. Da das println in der actionPerformed ja das richtige ausgibt, müsste der Fehler eigentlich dort sein.
 
Java:
   public static void search(String begriff)
   {
      Reader reader = null;
      int posi = 0;
      boolean gefunden = false;
      
      for (int k = 0; k < 10;k++)
      {
         if (Indexarray[k].Ordnungsbegriff == begriff)
         {
            System.out.println("bin in der if");
            posi = Indexarray[k].position;
            
            try
            {
               gefunden = true;
               
               reader = new FileReader( "Buch.txt" );

               System.out.println("Autor:" + Bucharray[posi].getAutor() + "\n");
               System.out.println("Titel:" + Bucharray[posi].getTitel() + "\n");
               System.out.println("Verlagsname:" + Bucharray[posi].getVerlagsname() + "\n");
               System.out.println("Erscheinungsjahr:" + Bucharray[posi].getErscheinungsjahr() + "\n");
               System.out.println("Erscheinungsort:" + Bucharray[posi].getErscheinungsort() + "\n");
               System.out.println("ISBN:" + Bucharray[posi].getISBN() + "\n");
            }
            catch ( IOException e ) {
               System.err.println( "Fehler beim Lesen der Datei!" );
               }
            finally {
               try { reader.close(); } catch ( Exception e ) { }
            }   
         }
       }

      if (gefunden == false)
      {
         System.out.println("Kein Buch zu diesem Ordnungsbegriff vorhanden!");
      }
   }

So. Rufe ich Daten.search("Mathe") auf gibt er "bin in der if" und alles funktioniert.

Rufe ich Daten.search(s) auf, gibt er kein "bin in der if" aus.

Obwohl er an einer stelle (glaub bei k=2 oder so) Ordnungsbegriff=Mathe findet und der begriff=Mathe ist, schlägt die Überprüfung fehl...

Gruß, Nemesys
 
Ändere mal bitte deine Abfrage
Java:
if (Indexarray[k].Ordnungsbegriff == begriff)
auf
Java:
if (Indexarray[k].Ordnungsbegriff.equals(begriff))
dann müsste es klappen.

Sonst vergleichst du nicht die Inhalte der Strings miteinander, sondern (glaube ich) deren Referenzen.
 
Hallo, ich bin's wieder.

Hoffe es ist okay, dass ich in diesem Thread einfach weiterschreibe und noch andere Fragen stelle aber will nicht für jede Frage nen neues Thema aufmachen müssen.

Frage 1: Warum funktioniert das hier nicht?:

Java:
         String String1 = Indexarray[i].getOrdnungsbegriff();
         String String2 = Indexarray[i+1].getOrdnungsbegriff();
         if (String1.compareTo(String2))
         {
            
         }

Also die Ordnungsbegriffe sind Strings, die ich ansich einfach nur alphabetisch sortieren will....
String1 < String2 geht ja leider schonmal garnicht...

Frage 2: In C++ kann man mit fwrite bitweise Schreiben und erhällt so eine UNFORMATIERTE Datei.
Was gibt es da in Java, was ich benutzen kann? Filewriter scheint eine ganz normale .txt anzulegen, die ich ohne weiteres mit einem Texteditor öffnen und lesen kann. Ist Fileoutputstream das richtige? (hab damit ein bisschen rumgespielt und hatte da eher probleme mit dem schreiben...) oder gibt es noch eine andere Möglichkeit eine Unformatierte Datei zu erzeugen in Java?


Gruß, Nemesys
 

Zurück
Oben