Variablen String zu Double, Merkwürdiger Fehler

Veraenderer

Mitglied
Hi,
ich versuch momentan ein Programm zu erstellen welches später einen Pendel simulieren soll (mit Diagrammen usw.). Momentan komme ich leider nicht weiter beim Umwandeln von Strings zu Doubles geht nichts mehr.

Fehler:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1008)
	at java.lang.Double.parseDouble(Double.java:540)
             ...
(Die Fehlermeldung hab ich gekürzt weil sie extrem lang war, die komplette Fehlermeldung hab ich als Anhang beigefügt)

Der Code:
Main Class:
Java:
/**
 * @Feuer der Veränderung 
 * @0.01
 */

class Main
{
    
    /**
     *  Main MEthode (wird beim Start der .jar Datei aufgerufen).
     */
    public static void main(String[] args)
    {
        Konstruktor neu = new Konstruktor ("Neues Pendel");
        neu.pack ();            
        neu.setSize (800,200);
        neu.setVisible (true);
        
    }
}
Konstruktor:
Java:
//Importiere für Swing Gui nötige Klassen
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
//definiere Fensterklasse
public class Konstruktor extends JFrame
{   
    //deklaiere Variblen
      private String g;
      private String ymax;
      private String m;
      private String l;
      private String luftdichte;
      private String tstart;
      private String tend;
      private String d;
      private TextField tf_g, tf_ymax, tf_m, tf_l, tf_luftdichte, tf_tstart, tf_tend, tf_d;
    //Erstellen von ActionListenern zum Erkennen vom klicken auf Buttons und zum Ausführen von Befehlen
    class KonstruktorActionListenerBeenden implements ActionListener {
        public void actionPerformed (ActionEvent e) {
        System.exit (0);
        }
    }
    class KonstruktorActionListenerLaden implements ActionListener {
        public void actionPerformed (ActionEvent e) {

        }
    }
    class KonstruktorActionListenerOk implements ActionListener {
        public void actionPerformed (ActionEvent e) {
        /*
        g=Double.parseDouble(tf_g.getText ());
        ymax=Double.parseDouble(tf_ymax.getText ());
        m=Double.parseDouble(tf_m.getText ());
        l=Double.parseDouble(tf_l.getText ());
        luftdichte=Double.parseDouble(tf_luftdichte.getText ());
        tend=Double.parseDouble(tf_tend.getText ());
        tstart=Double.parseDouble(tf_tstart.getText ());
        d=Double.parseDouble(tf_d.getText ());*/
        Gui maingui = new Gui ("Neues Pendel",g,ymax,m,l,luftdichte,tstart,tend,d);
        maingui.pack ();            
        maingui.setSize (1200,1000);
        maingui.setVisible (true);
        dispose ();
        }
    }

    //Konstruktor
    public Konstruktor (String titel)
    {
        //behält Fenstertitel
        super (titel);
        //initialisierung des Layout Managers
        setLayout (new GridLayout (5,1));
        //Erstellen der Panelle
        JPanel erstes =new JPanel ();
        erstes.setLayout (new FlowLayout ());
        
        JPanel zweites =new JPanel ();
        zweites.setLayout (new FlowLayout ());
        
        JPanel drittes =new JPanel ();
        drittes.setLayout (new FlowLayout ());
        
        JPanel viertes =new JPanel ();
        viertes.setLayout (new FlowLayout ());
        
        JPanel fuenftes =new JPanel ();
        fuenftes.setLayout (new FlowLayout ());
            //Erstellen der JTextFields
            JTextField tf_g = new JTextField (10);
            JTextField tf_ymax = new JTextField (10);
            JTextField tf_m = new JTextField (10);
            JTextField tf_l = new JTextField (10);
            JTextField tf_luftdichte = new JTextField (10);
            JTextField tf_tstart = new JTextField (10);
            JTextField tf_tend = new JTextField (10);
            JTextField tf_d = new JTextField (10);
            //Erstellen der Labels
            JLabel l_g = new JLabel ("Geben Sie die Gravitation an:");
            JLabel l_ymax = new JLabel ("Geben Sie die Starthöhe an:");
            JLabel l_m = new JLabel ("Geben Sie die Masse an:");
            JLabel l_l = new JLabel ("Geben Sie die Fadenlänge an:");
            JLabel l_luftdichte = new JLabel ("Geben Sie die Luftdichte an:");
            JLabel l_tstart = new JLabel ("Geben Sie die Startzeit an:");
            JLabel l_tend = new JLabel ("Geben Sie an nach wie vielen Sekunden die Simulation endet:");
            JLabel l_d = new JLabel ("Geben Sie den Durchmesser des Kugelförmigen Gewichts an:");
            //Erstellen der Buttons
            JButton b_Ok = new JButton ("Ok");
            JButton b_Beenden = new JButton ("Beenden");
            JButton b_Laden = new JButton ("Laden");
            //Verbinden der JTextFields/Buttons/Labels mit den Panellen
            erstes.add (l_g);
            erstes.add (tf_g);
            erstes.add (l_m);
            erstes.add (tf_m);
            zweites.add (l_ymax);
            zweites.add (tf_ymax);
            zweites.add (l_l);
            zweites.add (tf_l);
            drittes.add (l_luftdichte);
            drittes.add (tf_luftdichte);
            drittes.add (l_d);
            drittes.add (tf_d);
            viertes.add (l_tstart);
            viertes.add (tf_tstart);
            viertes.add (l_tend);
            viertes.add (tf_tend);
            fuenftes.add (b_Ok);
            fuenftes.add (b_Beenden);
            fuenftes.add (b_Laden);
            //Einfügen der Penele
            add (erstes);
            add (zweites);
            add (drittes);
            add (viertes);
            add (fuenftes);
        //Schließen der Anwendung wenn Fenster schließt
        setDefaultCloseOperation (WindowConstants.EXIT_ON_CLOSE);
        //Verbinden von Schaltflächen und ActionListener
        b_Beenden.addActionListener (new KonstruktorActionListenerBeenden());
        b_Ok.addActionListener (new KonstruktorActionListenerOk());
        b_Laden.addActionListener (new KonstruktorActionListenerLaden());
    }
        
    

}
Gui:
Java:
//Importiere für Swing Gui nötige Klassen
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
//definiere Fensterklasse
public class Gui extends JFrame
{
   //deklariere Variblen
    private String g;
    private String ymax;
    private String m;
    private String l;
    private String luftdichte;
    private String tstart;
    private String tend;
    private String d;
    //Erstellen von ActionListenern zum Erkennen vom klicken auf Buttons und zum Ausführen von Befehlen
    class GuiActionListenerBeenden implements ActionListener {
        public void actionPerformed (ActionEvent e) {
        System.exit (0);
        }
    }
    //Konstruktor
    public Gui (String titel, String newg, String newymax, String newm, String newl, String newluftdichte, String newtstart, String newtend, String newd)
    {
        //definieren von Variablen
        super (titel);
        g=newg;
        ymax=newymax;
        m=newm;
        l=newl;
        luftdichte=newluftdichte;
        tstart=newtstart;
        tend=newtend;
        d=newd;
        //Erstellen der Menüleiste
        JMenuBar menubar =new JMenuBar ();
        //Erstelle des Menüs
        JMenu menue =new JMenu ("Datei...");
        //Erstellt Menü Buttons
        JMenuItem mb_neu=new JMenuItem ("Neu");
        JMenuItem mb_saveas=new JMenuItem ("Speichern als...");
        JMenuItem mb_save=new JMenuItem ("Speichern");
        JMenuItem mb_laden=new JMenuItem ("Laden...");
        JMenuItem mb_beenden=new JMenuItem ("Beenden");
        //Hinzufügen der Buttons zur Menü
        menue.add (mb_neu);
        menue.add (mb_saveas);
        menue.add (mb_save);
        menue.add (mb_laden);
        menue.add (mb_beenden);
        //Hinzufügen des Menüs zur Menüleiste
        menubar.add (menue);
        //Hinzufügen des Menüs zum Fenster
        setJMenuBar (menubar);
        
        //Erstelle Layout Manager
        setLayout (new FlowLayout ());
        //Erstelle Panel
        JPanel diagramme=new JPanel ();
        //Erstelle Layout Manager vom Panel
        diagramme.setLayout (new GridLayout (2,1));
        //Erstelle Diagramme
        Diagram1 diagram1 = new Diagram1 ();
        //Übertrage Werte
        diagram1.getInformations (g,ymax,m,l,luftdichte,tstart,tend,d);
        //Füge Diagramme zum Panell hinzu
        diagramme.add (diagram1);
        //Füge Panel ins Fenster ein
        add (diagramme);
        //Zeichne Diagramme
        diagram1.repaint ();
        //Verbinden von Schaltflächen und ActionListener
        mb_beenden.addActionListener (new GuiActionListenerBeenden());
        //Schließen der Anwendung wenn Fenster schließt
        setDefaultCloseOperation (WindowConstants.EXIT_ON_CLOSE);

    }
}
und schließlich die Klasse die wahrscheinlich die Fehlermeldung hervorruft:
Diagram1:
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Diagram1 extends Canvas
{
   //deklariere Variblen
    private double g;
    private double ymax;
    private double m;
    private double l;
    private double luftdichte;
    private double tstart;
    private double tend;
    private double d;
    public Diagram1()
    {
        //Setze Hintergrundfarbe auf Weiß
        setBackground (Color.white);
        //Setze Linienfarbe auf schwarz
        setForeground (Color.black);
    }
    //Übertrage Variablen Werte
    public void getInformations (String newg, String newymax, String newm, String newl, String newluftdichte, String newtstart, String newtend, String newd) {
    g=Double.parseDouble(newg);
    ymax=Double.parseDouble(newymax);
    m=Double.parseDouble(newm);
    l=Double.parseDouble(newl);
    luftdichte=Double.parseDouble(newluftdichte);
    tstart=Double.parseDouble(newtstart);
    tend=Double.parseDouble(newtend);
    d=Double.parseDouble(newd);
    }
    public void paint (Graphics g) {
        int xpos, ypos;
        double x,y;
        String tend1;
        //tend1=(new Double (tend).toString ());
        g.setColor (Color.black);
        g.translate (10,190);
        //Zeichne Kordinatensystem
        g.drawLine (0,-190,0,10);
        g.drawLine (-10,0,290,0);
        g.drawLine (0,-190,-10,-180);
        g.drawLine (0,-190,10,-180);
        g.drawLine (290,0,280,10);
        g.drawLine (290,0,280,-10);
        g.drawString ("a", 250,-10);
        g.drawString ("end m", 20, -170);
        for (x=0; x<=290; x+=1) {
        g.setColor (Color.red);
        y=x/2;
        xpos=(int)x;
        ypos=-(int)y;
        g.drawLine (xpos,ypos,xpos,ypos);
        }
    }

    //Festelegen der Größe
    public Dimension getMinimumSize () {
    return new Dimension (300,200);
    }
    public Dimension getPreferredSize () {
    return getMinimumSize ();
    }
}

Die Fehlermeldung kommt nur wenn ich folgenden Code Teil eingefügt habe:
Java:
    g=Double.parseDouble(newg);
    ymax=Double.parseDouble(newymax);
    m=Double.parseDouble(newm);
    l=Double.parseDouble(newl);
    luftdichte=Double.parseDouble(newluftdichte);
    tstart=Double.parseDouble(newtstart);
    tend=Double.parseDouble(newtend);
    d=Double.parseDouble(newd);

Sry das ich das ganze Programm mit in den Thread geschrieben habe, aber ich kann an der Stelle wo ich die Strings in Double umwandle keinen Fehler erkennen und befürchte deshalb das ich irgendwo anders der Fehler liegt.
 

Anhänge

Zuletzt bearbeitet von einem Moderator:
Java:
    public void getInformations (String newg, String newymax, String newm, String newl, String newluftdichte, String newtstart, String newtend, String newd) {

Alle Strings sind null.

In deiner Konstruktor- Klasse is auch z.b. alles in der Action- Methode auskommentiert, wo du, so sieht es zumindest aus, die Werte eigentl. eintragen wolltest 😉

Aber irgendwie willst du da schon parsen obwohl die "Attribute" Strings sind... Die String- Attribute sind dort auch irgendwie überflüssig, da sie eh nur in der Methode verwendet werden, wenn ich das richtig sehe.

Weiterhin alle Textfelder, die du erzeugst sind nur in der Methode sichtbar/gültig und die Attribute der Textfelder sind ebenfalls alle null, weil sie nie zugewiesen werden (Da würdest du ebenfalls ne NPE bekommen). So kannst du den Text da nicht mehr rausholen
 
Zuletzt bearbeitet:
Ursprunglich wollte ich die Strings der TextFields schon in der Konstruktor Klasse umwandeln, da trat allerdings das Problem schon auf weshalb ich versucht habe die Strings später umzuwandeln. Anscheinend hab ich vergessen die Stelle anzupassen, was ich jetzt getan hab.

Java:
//Importiere für Swing Gui nötige Klassen
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
//definiere Fensterklasse
public class Konstruktor extends JFrame
{   
    //deklaiere Variblen
      private String g;
      private String ymax;
      private String m;
      private String l;
      private String luftdichte;
      private String tstart;
      private String tend;
      private String d;
      private TextField tf_g, tf_ymax, tf_m, tf_l, tf_luftdichte, tf_tstart, tf_tend, tf_d;
    //Erstellen von ActionListenern zum Erkennen vom klicken auf Buttons und zum Ausführen von Befehlen
    class KonstruktorActionListenerBeenden implements ActionListener {
        public void actionPerformed (ActionEvent e) {
        System.exit (0);
        }
    }
    class KonstruktorActionListenerLaden implements ActionListener {
        public void actionPerformed (ActionEvent e) {

        }
    }


    //Konstruktor
    public Konstruktor (String titel)
    {
        //behält Fenstertitel
        super (titel);
        //ActionListener für das Erstellen der Gui
        class KonstruktorActionListenerOk implements ActionListener {
        public void actionPerformed (ActionEvent e) {
        
        g=tf_g.getText ();
        ymax=tf_ymax.getText ();
        m=tf_m.getText ();
        l=tf_l.getText ();
        luftdichte=tf_luftdichte.getText ();
        tend=tf_tend.getText ();
        tstart=tf_tstart.getText ();
        d=tf_d.getText ();
        Gui maingui = new Gui ("Neues Pendel",g,ymax,m,l,luftdichte,tstart,tend,d);
        maingui.pack ();            
        maingui.setSize (1200,1000);
        maingui.setVisible (true);
        dispose ();
        }}
        //initialisierung des Layout Managers
        setLayout (new GridLayout (5,1));
        //Erstellen der Panelle
        JPanel erstes =new JPanel ();
        erstes.setLayout (new FlowLayout ());
        
        JPanel zweites =new JPanel ();
        zweites.setLayout (new FlowLayout ());
        
        JPanel drittes =new JPanel ();
        drittes.setLayout (new FlowLayout ());
        
        JPanel viertes =new JPanel ();
        viertes.setLayout (new FlowLayout ());
        
        JPanel fuenftes =new JPanel ();
        fuenftes.setLayout (new FlowLayout ());
            //Erstellen der JTextFields
            JTextField tf_g = new JTextField (10);
            JTextField tf_ymax = new JTextField (10);
            JTextField tf_m = new JTextField (10);
            JTextField tf_l = new JTextField (10);
            JTextField tf_luftdichte = new JTextField (10);
            JTextField tf_tstart = new JTextField (10);
            JTextField tf_tend = new JTextField (10);
            JTextField tf_d = new JTextField (10);
            //Erstellen der Labels
            JLabel l_g = new JLabel ("Geben Sie die Gravitation an:");
            JLabel l_ymax = new JLabel ("Geben Sie die Starthöhe an:");
            JLabel l_m = new JLabel ("Geben Sie die Masse an:");
            JLabel l_l = new JLabel ("Geben Sie die Fadenlänge an:");
            JLabel l_luftdichte = new JLabel ("Geben Sie die Luftdichte an:");
            JLabel l_tstart = new JLabel ("Geben Sie die Startzeit an:");
            JLabel l_tend = new JLabel ("Geben Sie an nach wie vielen Sekunden die Simulation endet:");
            JLabel l_d = new JLabel ("Geben Sie den Durchmesser des Kugelförmigen Gewichts an:");
            //Erstellen der Buttons
            JButton b_Ok = new JButton ("Ok");
            JButton b_Beenden = new JButton ("Beenden");
            JButton b_Laden = new JButton ("Laden");
            //Verbinden der JTextFields/Buttons/Labels mit den Panellen
            erstes.add (l_g);
            erstes.add (tf_g);
            erstes.add (l_m);
            erstes.add (tf_m);
            zweites.add (l_ymax);
            zweites.add (tf_ymax);
            zweites.add (l_l);
            zweites.add (tf_l);
            drittes.add (l_luftdichte);
            drittes.add (tf_luftdichte);
            drittes.add (l_d);
            drittes.add (tf_d);
            viertes.add (l_tstart);
            viertes.add (tf_tstart);
            viertes.add (l_tend);
            viertes.add (tf_tend);
            fuenftes.add (b_Ok);
            fuenftes.add (b_Beenden);
            fuenftes.add (b_Laden);
            //Einfügen der Penele
            add (erstes);
            add (zweites);
            add (drittes);
            add (viertes);
            add (fuenftes);
        //Schließen der Anwendung wenn Fenster schließt
        setDefaultCloseOperation (WindowConstants.EXIT_ON_CLOSE);
        //Verbinden von Schaltflächen und ActionListener
        b_Beenden.addActionListener (new KonstruktorActionListenerBeenden());
        b_Ok.addActionListener (new KonstruktorActionListenerOk());
        b_Laden.addActionListener (new KonstruktorActionListenerLaden());
        
    
    }
        
    

}

Der Fehler tritt leider immer noch auf 🙁 .
Aber trotzdem vielen Dank pl4gu33 .
 
Zuletzt bearbeitet:
Wie schon oben gesagt,.... nun bekommst du Probleme mit deinen Textfeldern da diese alle null sind.
 
Zuletzt bearbeitet:
Weist du nicht das es ein Debugger gibt?
Damit kannst du sehr einfach feststellen, was denn überhaupt null ist und dises dann im Vorfeld ändern.
Insofern du Eclipse benutzt is das der kleine Käfer neben den Start-Button.
Damit kannst du selbst schnell feststellen was dein Code überhaupt macht,
manchmal ist man so betriebsblind das man einfachste Fehler übersieht. (passiert mir zumindest sehr oft ;D)

Das soll nicht böse gemeint sein, aber ich kenne viele die nicht damit umgehen können oder überhaupt wissen wozu der ist.
 
@pl4gu33:
Du hattest Recht. Anscheinend muss ich mich nochmal ganz ausführlich mit JTextField und seinen Funktionen beschäftigen, weil ich um ehrlich zu sein immer noch nicht ganz kapiert hab wie ich das ganze jetzt genau machen muss 😉 .
Vielen Dank, ich hätte nie gedacht das der Fehler dort liegt.

@Daassan
Die Existenz des Debuggers ist mir bekannt, allerdings kann ich nicht mit ihm umgehen bzw. hab noch nie einen benutzt 😉 , beim nächsten mysteriösen Fehler werde ich ihn mal ausprobieren.
 
hat uns im studium auch keiner gezeigt und wir konnten das.
aber das trauchige daran, in den neuen semestern wrid genau das gleichegesagt... können wir nicht hat uns keiner gezeigt...

du weist schon wie die magie der Code ausführung aussieht oder?
naja bei der ausführung wird dein code durchgegangen zeile für zeile. nur halt ophne anhalten extrem schnell und ohne das man bemerkt das es einzelne schritte eigentlich sind.

der debugger verlangsamt das, du kansnt meist bei den zeilennummern doppeltklicken um ein haltepunkt zu setzen. oder via rechte maustaste -> haltepunkt setzen.
wenn du dann den debugger startest bleibt er mit ner marke an dieser zeile stehen.
und dann hast du 4 möglichkeiten zum fortfahren:
einzelschritt mit reingehen (also in methodenaufrufen wird reingegangen und diese auch abgearbeitet)
einzelschritt mit überspringen (methoden werden einfach abgearbeitet ohne diese einzeln durchzugehen)
sprung zum return
und natürlich weiterlaufen


eclipse springt dabei in eine debuggeransicht wo du ein fenster für die variablen und parameter und attribute hast
damit kannst du immer genau sehen was sich in diesen ändert.

es ist nicht wirklich schwer. schreib am besten mal ne kleinen algorithmus zb fibbozahlen und geh den durch dann sieht man das ganz gut was sich da alles in den vars tut und so. da erkennt man den zweck der toString methoede auch genau ;D es gibt kleines info fenster die diese methode einfach printet und ohne override wird einfach nur die ref angezeigt wie es halt in objekt steht.

naja hoffe das reicht als kleine anleitung ;D der debugger macht das leben eines informatikers seeeehhhrrrr viel einfacher

gruß daassan
 

Zurück
Oben