Problem mit Exception



  • Hallo, zusammen
    Ich sollte ein Applet für einen Würfel erstellen.
    Der gewünschte Algorithmus soll mit einem Optionsfeld
    angegeben werden. Der Würfel-Vorgang wird durch
    ein Button(hier "start") gestartet. Zuerst liefert
    der Würfel einen festen Wert(hier 3).
    Das Applet kann ich erstellen, aber wenn ich das
    "start" Button drücke, melden sich mehrere Fehler:

    Exception occurred during event dispatching:
    java.lang.ClassCastException: java.awt.Button
    at SuperWuerfel_Applet.actionPerformed(SuperWuerfel_Applet.java:21)
    at java.awt.Button.processActionEvent(Button.java:329)
    at java.awt.Button.processEvent(Button.java:302)
    at java.awt.Component.dispatchEventImpl(Component.java:2593)
    at java.awt.Component.dispatchEvent(Component.java:2497)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:339)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:131)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:98)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:85)

    /*********** Mein Code **********************/

    [java]
    import java.awt.;
    import java.awt.event.
    ;
    public class SuperWuerfel_Applet extends java.applet.Applet
    implements ActionListener
    {
    private Label ausgabe;
    private CheckboxGroup ursprung;
    private Button start;
    public void KonstanterWuerfel()
    {
    ausgabe.setText("" + 3);
    }
    public void ZufallsWuerfel()
    {

    }
    public void ZyklischerWuerfel()
    {

    }
    public void actionPerformed(ActionEvent e)
    {
    start = (Button)e.getSource();
    ursprung = (CheckboxGroup)e.getSource();
    if (start.getLabel().equals("Start"))
    {
    if (ursprung.getSelectedCheckbox().equals("KonstanterWuerfel"))
    for(int i=0;i<=9;i++)
    KonstanterWuerfel();
    else if (ursprung.getSelectedCheckbox().equals("ZufallsWuerfel"))
    for(int i=0;i<=9;i++)
    ZufallsWuerfel();
    else
    for(int i=0;i<=9;i++)
    ZyklischerWuerfel();
    }
    }
    public void init()
    {
    start = new Button("Start");
    add(start);
    start.addActionListener(this);
    CheckboxGroup cbg = new CheckboxGroup();
    add(new Checkbox("KonstanterWuerfel", false, cbg));
    add(new Checkbox("ZufallsWuerfel", false, cbg));
    add(new Checkbox("ZyklischerWuerfel", false, cbg));
    ausgabe = new Label();
    }
    }[/code]

    Soll man "throws" einsetzen?
    Danke im Voraus



  • Frage 1: Woher weisst Du, dass ein java.awt.Button dahinterliegt?

    start = (Button)e.getSource();
    

    Frage 2: Wie kannst du auf CheckboxGroup casten, wenn Du dir in (1) sicher bist, dass es ein java.awt.Button ist, das per e.getSource() zurückgeliefert wird?

    ursprung = (CheckboxGroup)e.getSource();
    


  • auhauaha... da sind aber einige nicht funktionierende dinge drin!
    1. Du erzeugst eine CheckboxGroup fügst aber gar keine Checkboxes hinzu (welche zu dieser Gruppe gehören).

    2. e.getSource();
    gibt dir nur die Quellkomponente, die eine Action ausgelöst hat.
    da du den Actionlistener nur zum Start-Button hinzugefügt hast, wird die Quelle auch nie was anderes sein.
    Versuch doch lieber statt
    CheckboxGroup cbg = new CheckboxGroup();
    folgendes:
    CheckboxGroup ursprung = new CheckboxGroup();
    und das: ursprung = (CheckboxGroup)e.getSource();
    kannst du dann ersatzlos streichen!

    Ausserdem ein Object auf 2 verschiedene Klassen zu Casten, die nicht viel miteinander zu tun haben, führt automatisch zu einer ClassCastException.
    🙄

    Object
         |
      Fahrzeug
       /    \
    Auto   Motorad
    
    public class FahrzeugVerschrottung{
      public Object getMotorad(){
        return new Motorad();
      }
      ...
      public void main(String args[]){
        FahrzeugVerschrottung fahrzeugVerschrottung = new FahrzeugVerschrottung();
        --- x = (---)fahrzeugVerschrottung.getMotorad();
      }
    }
    

    Mögliche Casts:
    Fahrzeug x = (Fahrzeug)fahrzeugVerschrottung.getMotorad();
    Motorad x = (Motorad)fahrzeugVerschrottung.getMotorad();

    ClassCastException bei:
    Auto x = (Auto)fahrzeugVerschrottung.getMotorad();

    Hoffe gehelft zu haben,
    MfG Ingo 🕶

    [ Dieser Beitrag wurde am 14.01.2003 um 12:30 Uhr von Ingo aka Desert Hawk editiert. ]



  • Jetzt haste ihn aber ganz schön zugetextet ...



  • Hehe, das ist eine Spezialität von mir 🕶
    naja ... ich mein ... ich hab meinen Text schon um einiges gekürzt 😃



  • Hallo,
    Jetzt bin ich soweit, daß es keine Fehlermeldung gibt. Aber wenn ich auf "Start" drücke, passiert gar nichts! Es sollte 10 mal "3" ausgeben!

    /********************** mein Code *********************/

    import java.awt.*;
    import java.awt.event.*;
    import java.lang.*;
    public class SuperWuerfel_Applet extends java.applet.Applet
       implements ActionListener
    {
        private Label ausgabe; 
        private CheckboxGroup ursprung = new CheckboxGroup();
        private Button start;
        public void  KonstanterWuerfel()
           {
               ausgabe.setText("" + 3);
          }
          public void  ZufallsWuerfel()
           {
    
          }
        public void  ZyklischerWuerfel()
           {
    
          }
        public void actionPerformed(ActionEvent e)
           {
             if (start.getLabel().equals("Start"))
             {
             if 
    (ursprung.getSelectedCheckbox().equals("KonstanterWuerfel"))         
    
             for(int i=0;i<=9;i++)                
                KonstanterWuerfel();
                else if (ursprung.getSelectedCheckbox().equals("ZufallsWuerfel"))
                   //for(int i=0;i<=9;i++)
                      ZufallsWuerfel();
                   else
                      //for(int i=0;i<=9;i++)
                         ZyklischerWuerfel();
             }
          }
        public void init()
           {
             start = new Button("Start");
             add(start);
             start.addActionListener(this);
             add(new Checkbox("KonstanterWuerfel", false, ursprung));
             add(new Checkbox("ZufallsWuerfel", false, ursprung));
             add(new Checkbox("ZyklischerWuerfel", false, ursprung));
             ausgabe = new Label();
             add(ausgabe, Label.LEFT);
          }
    }
    

    Gruss



  • mit equal geht da nix, vergleiche mal die checkboxen..

    habe nix am programm verändert , nur daß bei druck die drei erscheint..

    import java.awt.*;
    import java.awt.event.*;
    import java.lang.*;
    public class SuperWuerfel_Applet extends java.applet.Applet
    implements ActionListener
    {
        private Label ausgabe;
        private CheckboxGroup ursprung ;
        private Button start;
        Checkbox c1;
        Checkbox c2;
        Checkbox c3;
    
        public void KonstanterWuerfel()
        {
            ausgabe.setText("" + 3);
        }
    
        public void ZufallsWuerfel()
        {
    
        }
    
        public void ZyklischerWuerfel()
        {
    
        }
    
        public void actionPerformed(ActionEvent e)
        {
            if (start.getLabel().equals("Start"))
            {
    
                if(ursprung.getSelectedCheckbox()==c1){
    
                    for(int i=0;i<=9;i++)
                        KonstanterWuerfel();
                }
                else if (ursprung.getSelectedCheckbox()==c2)
                    //for(int i=0;i<=9;i++)
                    ZufallsWuerfel();
                else
                    //for(int i=0;i<=9;i++)
                    ZyklischerWuerfel();
            }
        }
    
        public void init()
        {
            ursprung = new CheckboxGroup();
            start = new Button("Start");
            add(start);
    
            start.addActionListener(this);
            ausgabe = new Label();
            add(ausgabe, Label.LEFT);
    
            c1=new Checkbox("KonstanterWuerfel",ursprung ,false);
            c2=new Checkbox("ZufallsWuerfel", ursprung,false );
            c3=new Checkbox("ZyklischerWuerfel", ursprung ,false);
            add(c1);
            add(c2);
            add(c3);
    
        }
    }
    

    [ Dieser Beitrag wurde am 17.01.2003 um 19:50 Uhr von elise editiert. ]



  • Original erstellt von elise:
    **mit equal geht da nix, vergleiche mal die checkboxen..
    **

    selbstverständlich würde das auch mit equal gehen. 🙄
    Allerdings vergleichst du hier Äpfel mit Birnen.
    Du überprüfst, ob ein Object vom Typ Checkbox gleich einem Object vom Typ String ist.
    ursprung.getSelectedCheckbox().equals("ZufallsWuerfel")
    Das daraus nie ein wahrer Wert wird, ist wohl klar... (auf normalen Wegen) 😉

    aber einfacher ist das sicherlich mit dem vergleich der beiden Adressen.
    ursprung.getSelectedCheckbox()==c1

    In diesem Fall ists wohl ziemlich egal, was du machst, aber in der Regel
    sollte man wissen, was man vergleichen will.

    Mit == überprüfst du ob es sich um das selbe Object handelt (bzw. vergleichst ob die beiden Adressen gleich sind)
    und mit equals kannst du überprüfen, ob es sich um das gleiche Object handelt (also nicht unbedingt das selbe, es kann auch ein anderes sein, aber mit den gleichen Eigenschaften)

    MfG Ingo



  • Original erstellt von Ingo aka Desert Hawk:
    selbstverständlich würde das auch mit equal gehen. 🙄
    Allerdings vergleichst du hier Äpfel mit Birnen.

    Also gehts doch nicht...?

    Mit == überprüfst du ob es sich um das selbe Object handelt (bzw. vergleichst ob die beiden Adressen gleich sind)
    und mit equals kannst du überprüfen, ob es sich um das gleiche Object handelt (also nicht unbedingt das selbe, es kann auch ein anderes sein, aber mit den gleichen Eigenschaften)

    Das wiederum stimmt denn die equals-Methode ruft intern die hashCode-Methode auf, die für unterschiedliche Objekte mit gleichen Eigenschaften (Inhalt) den selben int-Wert zurückliefert. Darüber kann darauf geschlossen werden, dass es sich um zwei Objekte handelt, die in ihrem Inhalt identisch sind (gesetzenfalls der gute Programmierer hat die hashCode-Methode sauber implementiert).



  • Original erstellt von CengizS:
    **
    Also gehts doch nicht...?
    **

    Hehe, wenn Du den einen Apfel mit nem anderen vergleichst, dann hast du evtl ne Chance einen ähnlichen Apfel zu erwischen 😉
    Aber bei ner Birne liegst du da auf jeden fall verkehrt :p
    Vergleichen kann man mit equals ja alles, was ein Object ist, obs Sinn macht ist ja die Frage 🕶



  • Eben



  • Original erstellt von Ingo aka Desert Hawk:
    **selbstverständlich würde das auch mit equal gehen. 🙄
    **

    schon ok, wollte es einfach nur schnell zum laufen kriegen.. so long

    [ Dieser Beitrag wurde am 18.01.2003 um 12:22 Uhr von elise editiert. ]



  • Und ich wollt nur ein wenig klugscheissen 😃
    naja, und vielleicht jemand anderem noch was beibringen...
    Nichts hat halt keine Nebeneffekte 😉


Anmelden zum Antworten