Fehlermeldungen erscheinen erst in der Ausführung des Programms

SteveT

Mitglied
Hallo,

jedes Mal, wenn ich mein Programm starte kommt folgende Fehlermeldung in Eclipse:
Code:
Errors occurred during the build.
Errors running builder 'Java Builder' on project 'GuitarRecs'.
info cannot be null
Mein Code besteht aus drei Klassen, die zwangsläufig miteinander verknüpft sind. Mit dem Programm will ich ein Mikro verschieden oft aufnehmen. Die einzelnen Aufnahmen werden jeweils als Spur in einer Leiste abgespeichert.
Die erste Klasse ist quasi das Hauptinterface mit dem Frame, etc.:
Java:
package programm;
....
public class Tonstudio{
  
    JPanel mainpanel;
    ....

    void studiointerface(){
     ....
    }
}
Die Zweite Klasse liefert das Interface für die Spuren:
Java:
package programm;
....
public class SpurenInterface extends Tonstudio{


    JMenuBar[] audiobar = new JMenuBar[anz];
    ....

    void spinterface() {
    ....
    }

}
So die letzte Klasse enthält die ganzen ActionListener, sie ist das Problem.
Java:
package programm;
....
public class Actionclass extends SpurenInterface{

    AudioInputStream audiostream;
    ....
    public void clickhandler(){
    ...
    }
}
Erst nachdem ich das Programm starte erscheinen in der Klasse Fehlermeldungen in der drittten Klasse. In der ersten Zeile (package programm) erscheint die Fehlermeldung "Internal compiler error: java.lang.IllegalArgumentException: info cannot be null at org.eclipse.jdt.internal.compiler.codegen.StackMapFrame.addStackItem(StackMapFrame.java:81)". Die anderen Fehlermeldungen im Code sind meistens "Cannot make a static reference to the non-static field".
Ich bin echt total ratlos, vor allem, weil ich alle Fehlermeldungen vor ausführen des Codes korrigiert habe.
Danke schonmal im Vorraus für die Hilfe!
 
Und wir sollen jetzt raten was es sein könnte? Wie wäre es Du zeigst und mal den Code?

Weiterhin ist Dein Konzept Quatsch. Warum erbt SpurenInterface (Was auch immer das überhaupt sein soll) von Tonstudio. Ist eine Spur ein erweitertes Tonstudio? Bestimmt nicht. Eine Spur ist Bestandteil eines Aufnahmegerätes, welches wiederum Teil des Tonstudios ist. Aber nicht anders herum.

Gruß

Claus
 
Raten nicht. Hätte ja sein können, dass man daran schon den Fehler sieht. Ich denke, dass es nicht an den einzelnen Befehlen im Code liegt, da selbst ohne Befehle wird die Klasse nicht kompiliert, da immer noch diese Exception da ist:
In der ersten Zeile (package programm) erscheint die Fehlermeldung "Internal compiler error: java.lang.IllegalArgumentException: info cannot be null at org.eclipse.jdt.internal.compiler.codegen.StackMapFrame.addStackItem(StackMapFrame.java:81)"
Und zu meinem Konzept: Die Klasse Tonstudio erzeugt das Fenster und die Bedienelemte. Mit Spuren sind die verschiedenen Aufnahmen gemeint, also die fertigen Tonspuren. Die Klasse SpurenInterface erzeugt somit das Interface der einzelnen Spuren, die eine Erweiterung der Tonstudioklasse sind.
Steht aber alles auch in meinem ersten Beitrag.
 
Raten nicht. Hätte ja sein können, dass man daran schon den Fehler sieht.
Am StackTrace kann man sehen wo genau der Fehler passiert. Es wird die Datei + die Zeile verraten. Dort muss man dann entsprechend schauen was kann die Fehlermeldung auslösen und warum gerade diese Fehlermeldung.
Was auch immer "info" ist, irgendwo soll damit gearbeitet werden kann aber nicht das die Variable nicht initialisiert wurde.

Ich denke, dass es nicht an den einzelnen Befehlen im Code liegt, da selbst ohne Befehle wird die Klasse nicht kompiliert, da immer noch diese Exception da ist:
Ja hier gibt es ein Problem mit deinem Compiler, welchen kann ich nicht sagen müsste ich raten bzw. selbst erst googeln.

... Die Klasse SpurenInterface erzeugt somit das Interface der einzelnen Spuren, die eine Erweiterung der Tonstudioklasse sind.
Was bedeutet "erzeugt damit das Interface der einzelnen Spuren"? Meinst du das UserInterface?
Wenn ja, ist hier eine Ableitung von Tonstudio trotzdem ein Fehler. Jedes Objekt deiner Klasse "SpurenInterface" ist zugleich ein Tonstudio, und das ist nicht dein Ziel oder?
 
Die erste Klasse ist quasi das Hauptinterface mit dem Frame, etc.
Die Zweite Klasse liefert das Interface für die Spuren:
So die letzte Klasse enthält die ganzen ActionListener, sie ist das Problem.
Ich stimme Thallius zu: Ich sehe keinen Sinn darin, dass die zweite Klasse die erste erweitert und die dritte Klasse die zweite. Aufgrund dieser Vererbungshierarchie kann nämlich auch die letzte Klasse als "Hauptinterface mit dem Frame etc." verwendet werden.
 
Gut, dann werde ich mein Code dementsprechend ändern.
Aber noch eine Frage: Wie kann ich die ganzen Objekte klassendübergreifend aufrufen, ohne static bei jedem Objekt benutzen zu müssen?
 
Java:
public class Tonstudio{

   JPanel mainpanel;
    ....
   JButton button = new JButton();
   button.addActionListener(new ActionClass(this));
   mainpanel.add(button);
}

Java:
public class Actionclass extends SpurenInterface{

   Tonstudio tonstudio;
  
    public ActionClass(Tonstudio tonstudio)
   {
       this.tonstudio = tonstudio;
    }
}

So kannst du bswp. Objekte an andere Klassen referenzieren 🙂

Gruß
Robert
 
Ok danke.
Aber so muss ich ja noch vor jedem Objekt tonstudio.objekt schreiben, geht das nicht flotter ohne das vorher zu deklarieren?
 
Also willst du auf Variablen in einer anderen Klasse zugreifen? Dann hab ich dich falsch verstanden.
Ist aber egal weils aufs selbe hinaus läuft.
Du musst aber jeder Variable noch Getter und Setter (wenn nötig) deklarieren.

Bsp:

Java:
public class Hauptklasse
{
    private Beispiel beispiel;

    public Hauptklasse()
    {
        beispiel = new Beispiel();
        beispiel.setFooBar("foo");
        beispiel.getFooBar();
    }
}

Java:
public class Beispiel
{
    private String foobar;

    public Beispiel()
    {
        //...
    }

    // GETTER
    public String getFoobar() { return this.foobar; }

    // SETTER
    public void setFoobar(String foobar) { this.foobar = foobar; }
}
 
Danke für die Tipps.
Für 22 verschiedene Objekte wäre es aber glaub ich einfacher, wenn ich die mit deiner ersten Variante deklariere 🙂
 
22 Objekte sind doch gar nichts.
Du musst halt immer den Grundprinzipien folgen. Sind die Objekte Eigenschaften eines anderen Objekts?
Dann behandle sie auch so. Schreib Getter und Setter, so wie es sich gehört. Rufe sie über eine Referenz auf das instanzierte Objekt auf.
Wenn alle Objekte den gleichen Typ haben, dann denk mal über eine HashMap und Keys nach.
Dann hast du genau eine Variable, eine Get-Methode und eine Set-Methode
 

Zurück
Oben