Problem mit globalen und lokalen Variablen

Diskutiere Problem mit globalen und lokalen Variablen im Plauderecke Forum; Ich habe ein Problem mit globalen und lokalen Variablen. So wie ich die Sache sehe, kann ich keine globalen Variablen in einer Klasse erstellen...

  1. scitex
    scitex Mitglied
    Ich habe ein Problem mit globalen und lokalen Variablen. So wie ich die Sache sehe, kann ich keine globalen Variablen in einer Klasse erstellen und muss z.B. wenn ich einen String in double Umwandeln will, Hilfsvariablen anlegen um diese dann lokal in z.B. einer Methode, in der diese benötigt wird, lokal umzuwandeln.

    Dieser Code ist nicht vollständig und der Übersicht wegen auf die relevanten Stellen gekürzt:

    Code (Java):
    class Dreieck
    {
       
        private String a="", b="", c="";
        double dFlaeche=0, dUmfang=0;
     
        //Hier ist ein Problem: Wenn ich diese Hilfs Variablen erstelle, um in den Methoden der Klassen die eingegebenen String Werte lokal in double zu wandeln
        //habe ich Probleme wie z.B. das jeweils nur eine Variante möglich ist: entweder ich gebe diese Werte als String ein und Wandel die lokalen Variablen in double um
        //und ich muss darauf verzichten mehrere Rechnungsvarianten
        //durchzuführen oder ich versuche die Variablen gleich am Anfang in den Klassen mit z.B. a1=Double.parseDouble(a); zu umzuwandeln, was nicht funktioniert.
        //also pauschal gesagt ist dies ein Problem mit der Umwandlung von Datentypen die nur mit lokalen Variablen funktionieren?!

    //double a1=0, b1=0, c1=0 ;
    //a1=Double.parseDouble(a); funktioniert nur lokal in den Methoden?!
     
        //Konstruktor:
     
        Dreieck (String a, String b, String c, double dFlaeche, double dUmfang)
        {
            this.a = a;
            this.b = b;
            this.c = c;
            this.dFlaeche = dFlaeche;
            this.dUmfang = dUmfang;
        }
     
        //hier sind get und set ...
     
        //Methode Flächeninhalt Dreiecks
        public double berechneDreieckFlaeche()
        {
            double a1, b1;
            a1=Double.parseDouble(a);
            b1=Double.parseDouble(b);
            dFlaeche1=Double.parseDouble(dFlaeche);
            dFlaeche = (a1 * b1)/2;

            System.out.println("Die Dreieckfläche ist: "+dFlaeche+" cm²");
            return dFlaeche;
        }
     
        //Methode Umfang Dreieck
        public double berechneDreieckUmfang()
        {
            double a1, b1,c1;
            a1=Double.parseDouble(a);
            b1=Double.parseDouble(b);
            c1=Double.parseDouble(c);        //logischer Fehler, da kein String Wert c in double c1 umgewandelt werden kann, wenn keine Eingabe von c erfolgte.
            dUmfang = a1 + b1 + c;
            System.out.println("Der Dreieckumfang ist: "+dUmfang+" cm");
     
            return dUmfang;
        }
    }

    class PrismaRechner extends JFrame
    {

        //Konstruktor der Klasse PrismaRechner (wird nicht genutzt, habe ich zur Sicherheit erstellt)
     
        PrismaRechner (String a, String b, String c, double dFlaeche, double dUmfang, String h, double prismaflaeche, double volumen )
        {
            this.a = a;
            this.b = b;
            this.c = c;
            this.dUmfang = dFlaeche;
            this.dFlaeche = dUmfang;
            this.h = h;
            this.prismaflaeche = prismaflaeche;
            this.volumen = volumen;
        }
     
        public String a="", b="",c="", h="";
        public double dFlaeche=0, dUmfang=0, prismaflaeche=0, volumen=0;
     
        JLabel la, lb, lc, ldFlaeche, ldUmfang, lh, lprismaflaeche, lvolumen;
        JTextField ta, tb, tc, tdFlaeche, tdUmfang, th, tprismaflaeche, tvolumen;
        JButton bRechnen, bLoeschen;
     
        public PrismaRechner()
        {
            super ("PrismaRechner");
     
            Container container=getContentPane();
            container.setLayout(new GridLayout(3,4,10,10));
            setLayout(null);
            setSize(685, 230);
            setResizable(true);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setLocationRelativeTo(null);
     
            //Labels, Textfelder und Buttons erstellen
     
            //...
            //...
     
            //ActionListener für den Button "rechnen"
            bRechnen.addActionListener (new ActionListener()
            {
                public void actionPerformed(ActionEvent ae)
                {
                    rechnen();
                }
            });
     
            //ActionListener für den Button "löschen"
            bLoeschen.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent ae)
                {
                    loeschen();
                }
       
            });
     
        }
     
        //Methode für die ActionListener der Buttons "rechnen" und "löschen" der Eingabe
     
                //Methode die ausgeführt wird wenn der Button "rechnen" angeklickt wird
                public void rechnen()
                {
                    ta.getText();
                    tb.getText();
                    tc.getText();
                    tdFlaeche.getText();
                    tdUmfang.getText();
                    th.getText();
                    tprismaflaeche.getText();
                    tvolumen.getText();
           
                    String sa = ta.getText();
                    String sb = tb.getText();
                    String sc = tc.getText();
                    String sh = th.getText();
           
                    String sdUmfang;
                    String sdFlaeche;
           
                    String sprismaflaeche;
                    String svolumen;
           
                    Prisma p = new Prisma (sa, sb, sc, dUmfang, dFlaeche, sh, prismaflaeche, volumen);  //Variablen in ein Prisma Objekt einfügen
       
                    p.berechneDreieckFlaeche();
                    p.berechneDreieckUmfang();
                    //weitere Berechnungen z.B. aus der Klasse Prisma

                    tdFlaeche.setText(Double.toString(p.dFlaeche));
                    tdUmfang.setText(Double.toString(p.dUmfang));
           
                    tprismaflaeche.setText(Double.toString(p.prismaflaeche));
                    tvolumen.setText(Double.toString(p.volumen));
           
                    System.out.print("Die Fläche Dreieck:" +p.dFlaeche +"cm² \n");
                    System.out.print("Der Umfang Dreieck:" + p.dUmfang +"cm \n");
                    System.out.print("Die Hypotenuse Dreieck:" + p.getC() +"cm \n");
                    System.out.print("Die Prismafäche:" + p.prismaflaeche +"cm² \n");
                    System.out.print("Das Volumen Prisma:" + p.volumen +"cm³ \n");
                    System.out.print("Die Eigegebenen Werte lauten "+p.getA()+"cm für a "+p.getB()+"cm für b " +p.h+ "cm für die Höhe");
                }
                   
                //Methode die ausgeführt wird wenn der Button "löschen" geklickt wird
                public void loeschen()
                {
                    ta.setText("");
                    tb.setText("");
                    tc.setText("");
                    tdFlaeche.setText("");
                    tdUmfang.setText("");
                    th.setText("");
                    tprismaflaeche.setText("");
                    tvolumen.setText("");
                }

    }
     
    Also z.B. so:

    Code (Java):
        double a1, b1, c1;
     
        a1=Double.parseDouble(a);
        b1=Double.parseDouble(b);
        c1=Double.parseDouble(c);
    bei dem dahinter stehenden Konstruktor habe ich dann diese Fehlermeldung:

     
    Zuletzt bearbeitet: 2. Mai 2018
  2. Vielleicht hilft dir dieser Kurs hier weiter (Klick!)
  3. krgewb
    krgewb Aktives Mitglied
    Das ist nicht der richtige Platz für Logik.
    Selbst so etwas würde an der Stelle nicht funktionieren:
    Code (Java):
    double a1=0, b1=0, c1=0;
    a1++;
     
  4. scitex
    scitex Mitglied
    Wenn ich z.B. mit einer GUI arbeite und dann die Variablen bzw. Werte, die in den Klassen genutzt werden sollen, in String eingegeben werden, macht dies schon Sinn diese Variablen in den Klassen global zu wandeln, wenn für die Berechnung z.B. double als Datentyp benötigt wird, wie ich die Sache sehe.

    Ansonsten wird der JavaCode nur unnötig unübersichtlich und kompliziert und ineffizient.

    Wo ist den der passende Platz dafür?
     
  5. mrBrown
    mrBrown Super-Moderator Mitarbeiter
    Dein Problem ist im wesentlichen ein Design-Problem: niemand würde Seiten eines Dreiecks als String deklarieren. (Außer du möchtest das Dreieck (Alice, Bob, Eve) zulassen, damit kann man aber nicht rechnen).
    Von daher gäbe es in der Dreiecks-klasse dieses Problem nicht, und die Umwandlung müsste nur bei Erzeugung eines neuen Dreiecks passieren, was im Normalfall Lokal passiert.


    Außerdem sind Hilfsvariablen quasi per Definition Lokal: entweder sie gehören zu einem Objekt, dann sind sie Teil des Objektes und keine „Hilfe“ für irgendeine Rechnung mehr, oder sie sind eben nur für eine Rechnung, und damit Lokal. (Ausnahmen bestätigen die Regel)


    BTW: „global“ ist ein in Java verpönter Ausdruck, weil 12 verschiedene Personen darunter 12 verschiedene Dinge verstehen. ;)
     
    Zuletzt bearbeitet: 2. Mai 2018
  6. scitex
    scitex Mitglied
    Ansichtsache: wenn ich wie gesagt mit einer GUI arbeite, dann müssen die eingegeben Werte der Textfelder so oder so gewandelt werden in einen Datentyp wie double. Und wenn ich z.B. double nutze, dann habe ich im Grunde ein ähnliches Problem.

    Ja dann zeig doch mal JavaCode, wie es deiner Meinung nach besser wäre?!
     
  7. MoxxiManagarm
    MoxxiManagarm Aktives Mitglied
    Ich würde a-c garnicht erst als String abspeichern, so wie mrBrown sagt. Das heißt aber nicht, dass du die Werte nicht als String dem Konstruktor geben darfst. Du kannst das tun und z.B. eine IllegalArgumentException werfen, falls der Wert nicht geparsed werden kann oder beispielsweise negativ ist (was er vermutlich auch nicht sein darf).

    Code (Java):

    package javaforum.org.examples;

    public class StringToPosDouble {

        private double a;
     
        public StringToPosDouble(String a) throws IllegalArgumentException {
            try {
                this.a = Double.parseDouble(a);
            } catch (NumberFormatException e) {
                throw new IllegalArgumentException("Wert konnte nicht geparsed werden.");
            }
         
            if(this.a <= 0) throw new IllegalArgumentException("Wert muss größer 0 sein.");
        }
    }

     
    MrBrown will auch nur sagen - in einer GUI ist der String natürlich berechtigt. Aber dein Dreieck ist an der Stelle ein Model und da hat der String als solches in dem fachlichen Zusammenhang nichts mehr zu tun und von daher in der Klasse Dreieck als Feld ein Designfehler.
     
    Zuletzt bearbeitet: 2. Mai 2018
  8. scitex
    scitex Mitglied
    MrBrown will auch nur sagen - in einer GUI ist der String natürlich berechtigt. Aber dein Dreieck ist an der Stelle ein Model und da hat der String als solches in dem fachlichen Zusammenhang nichts mehr zu tun und von daher in der Klasse Dreieck als Feld ein Designfehler.[/QUOTE]

    Hört sich ja alles im ersten Moment gut und richtig an, nur beantwortet dies alles nicht meine Frage in diesem Thread. Warum kann ich keine Instanz Variablen in einer Klasse erstellen, auf die ich dann z.B. von einer anderen Klasse zugreifen kann? Ich habe extra in meinem älteren Java Wälzer noch mal gelesen und habe daraus gelesen, dass das was ich mit dem Code eigentlich vorhabe, eigentlich auch funktionieren sollte.
     
    Zuletzt bearbeitet: 2. Mai 2018
  9. mrBrown
    mrBrown Super-Moderator Mitarbeiter
    Die Frage stellst du ja jetzt auch zum ersten Mal.
    Möglicherweise liegt das schon daran, dass es keine „globalen“ Variablen in Java gibt ;)
    Auf alle Variablen mit passendem Scope kann man natürlich zugreifen. Warum das bei dir nicht klappt, ist jetzt nur raten...
     
  10. MoxxiManagarm
    MoxxiManagarm Aktives Mitglied
    Was verstehst du denn unter globaler Variable?

    In meinem Beispiel könnte man a auch als global betrachten und wenn ich einen getter hinzufügen würde, könnte ich diese auch von einer anderen Klasse abrufen. Nur irgendwelche parse-Methoden oder sonstige Logik haben bei der Initialisierung nichts verloren und ja diese sollten theoretisch auch nur in Methoden und Konstruktoren möglich sein - nicht zuletzt wegen der möglichen Exception von parseDouble. Generell würde ich die Wertzuweisung bei der Deklaration einer Klassenvariablen vermeiden und das dem Konstruktor überlassen.
     
    Zuletzt bearbeitet: 2. Mai 2018
  11. scitex
    scitex Mitglied
    Ich betrachte meine Logik in dem Fall als auch richtig:

    Ich habe eine GUI, bei der ich String Werte eingebe. Für die Berechnung eines Dreiecks in einer Klasse und für die Berechnung eines Prisma in einer weiteren Klasse mit Vererbung, benötige ich z.B. double Werte. Um diese in den Methoden zum berechnen der Ergebnisse für den Rechner nutzen zu können, will ich diese in den Klassen als Instanz Variablen wandeln nach Übergabe durch den Konstruktor an die Klasse bzw. dem Objekt Dreieck und Prisma, zum berechnen in den jeweiligen Methoden. Und um die Ergebnisse in den jeweiligen Textfeldern auszugeben muss ich noch mal umwandeln: von double in String wandeln.

    Das was hier welche als Design Problem ansehen ist nicht unbedingt eins:

    In dem Fall Dreieck bzw. Prisma ist es zwar einerseits unlogisch aber die Klasse Prisma erbt von Dreieck und nicht umgekehrt. Quasi eine Vererbung von unten nach oben! Klingt paradox und ist es auch in dem Beispiel Prisma und Dreieck, falls es euch noch nicht aufgefallen ist!!!

    Und dieser Zusammenhang erschwert in diesem Beispiel (da Java keine Mehrfachvererbung anbietet) die Programmierung für diesen Rechner.
     
    Zuletzt bearbeitet: 2. Mai 2018

Die Seite wird geladen...

Problem mit globalen und lokalen Variablen - Ähnliche Themen

Verständnisproblem mit globalen Variablen (Connection)
Verständnisproblem mit globalen Variablen (Connection) im Forum Datenbankprogrammierung
Thread-Problem...
Thread-Problem... im Forum Allgemeine Java-Themen
SwingUtils / Thread Problem
SwingUtils / Thread Problem im Forum AWT, Swing, JavaFX & SWT
JavaFX Problem beim Aufrufen einer Methode
JavaFX Problem beim Aufrufen einer Methode im Forum AWT, Swing, JavaFX & SWT
Probleme bei rekursiver Zuordnung
Probleme bei rekursiver Zuordnung im Forum Java Basics - Anfänger-Themen
Thema: Problem mit globalen und lokalen Variablen