Seltsame Exception

Status
Nicht offen für weitere Antworten.

unknown_member

Bekanntes Mitglied
Hallo!

Ich habe zwei Progs, die GUI und eine Nebenklasse Move. Kompiliere ich sie, klappt alles. Aber beim ausführen wird so eine lange Exception geworfen, die nicht mal mehr in die Eingabeaufforderung passt, also alles was darüber stand gelöscht wird und sie immer noch nicht fertig geschrieben ist, also oben auch ein Stück gelöscht worden ist.
Aber das ist nicht so wichtig, wichtig ist, wieso die Exception geworfen wird.


Hier der Code:



Die GUI Xtreme:
Code:
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.*;
import javax.imageio.*;


public class Xtreme extends JFrame
   implements ActionListener, MouseListener, WindowListener, KeyListener {

   JPanel               game;
   JPanel                set;

   JButton              ende;

   BufferedImage              player;
   BufferedImage  background;
   ImageIcon           close;

   int                location = 100;
   int                  height = 400;
   
   Move                 move;
   

   public static void main(String [] args) throws IOException {

    Xtreme go = new Xtreme();
    go.setTitle("Volleyball X-treme");
    go.setSize(Toolkit.getDefaultToolkit().getScreenSize());
	go.setUndecorated(false);  //Wenn fertig programmiert und getestet, auf true setzen
    go.setCursor(CROSSHAIR_CURSOR);
	go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	go.setResizable(false);
	go.setVisible(true);
    }


	Xtreme() {
    makeGui();
    addWindowListener(this);
	}


   public void makeGui() {
   
   game = new JPanel();
   set  = new JPanel();
   
   
   move = new Move();
   
   
   close = new ImageIcon( "close.gif" );
   
   
	try {
     background = ImageIO.read(new File("Background_Street.gif"));
	 player     = ImageIO.read(new File("player_one.gif"));
     }
     catch(IOException e) {
     e.getMessage();
     }

}

   public void paint(Graphics g) {
    super.paint(g);
    g.drawImage(background, 0, 0, this);
	g.drawImage(player, location, height, this);
   }
   

   public void keyReleased(KeyEvent ev) { }
   public void actionPerformed(ActionEvent event) { }
   public void mouseEntered(MouseEvent ev) { }
   public void mouseExited(MouseEvent ev) { }
   public void mouseClicked(MouseEvent ev) { }
   public void mouseReleased(MouseEvent ev) { }
   public void mousePressed(MouseEvent ev) { }
   public void windowOpened(WindowEvent e) { }
   public void windowIconified(WindowEvent e) { }
   public void windowClosed(WindowEvent e) { }
   public void windowActivated(WindowEvent e) { }
   public void windowDeiconified(WindowEvent e) { }
   public void windowDeactivated(WindowEvent e) { }
   public void windowClosing(WindowEvent e) { }
   

   
   public void keyPressed(KeyEvent ev) {



   if (ev.getKeyCode() == KeyEvent.VK_UP) {


//Hier funktioniert der Sprung noch nicht, da ein Thread-Problem aufgetreten ist. -- Es wird bald durch eine neue Klasse "Move" gelöst. -- Vielleicht.

}

   if (ev.getKeyCode() == KeyEvent.VK_LEFT && location != 15) {
	  
    move.bLeft();
	
   }
   
   if (ev.getKeyCode() == KeyEvent.VK_RIGHT && location != 400) {
	  
   location+=5;
   repaint(); 
   }
   
   
   }
   public void keyTyped(KeyEvent ev) { }
 }



Die Nebenklasse Move:


Code:
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.applet.*;
import java.net.*;
import java.io.File;
import java.awt.image.*;
import javax.imageio.*;


public class Move extends Xtreme
   implements ActionListener, MouseListener, KeyListener {
   
   boolean               bLeft = false;
   boolean              bRight = false;
   Xtreme                    x;
   
   Move() {
   makeGui();
   addKeyListener(this);
   }

   
   public void makeGui() {
   
    x = new Xtreme();
   
  }    
   public void actionPerformed(ActionEvent event) { }
   
   
    
    
   public void mouseEntered(MouseEvent ev) { }
    
   public void mouseExited(MouseEvent ev) { }
    
   public void mouseClicked(MouseEvent ev) {
   
   }
   
   public void handleMouseEvent(MouseEvent ev){ }


   
   public void keyPressed(KeyEvent ev) {
   

  }
  
  public void bLeft() {
   location-=5;
   x.repaint();
  }
   
   
   
   public void mousePressed(MouseEvent ev) { }
   public void keyTyped(KeyEvent ev) { }
   public void keyReleased(KeyEvent ev) { }
   public void mouseReleased(MouseEvent ev) { }
   
   public static void main (String[] args) {
   }
    
}




So sollte alles aussehen:

GUI.gif



Ein Ausschnitt der Exception:

Exception.gif




thx für eure Antworten schonmal, unknown_member
 
Ist das ein Ratespiel und wir sollen erraten um was für eine Exception es sich handelt und in welcher Zeile welcher Datei sie geworfen wird?

Du hast dir ja viel Mühe gegeben, aber die wirklich nützlichen Infos hast du nicht geliefert 😉
 
Konstrukter Xtreme:
Code:
 Xtreme() {
    makeGui();
    addWindowListener(this);
   }


Code makeGui() von Xtreme:

Code:
 public void makeGui() {

// ...   
   
   move = new Move(); 

// ...

Also Xtreme erzeugt ein Objekt Move.

Klasse Move:
Code:
public class Move extends Xtreme

Konstruktur Move:
Code:
   Move() {
   makeGui();
   addKeyListener(this);
   }

Erste Stelle an der es knallt:

Wenn der Konstruktor von Move aufgerufen wird, wird auch autoamtisch der der Konstruktor der Oberklasse, also Xtreme aufgerufen, der ein Objekt vom Type Move erzeugt, womit der Konstruktor von Move aufgerufen wird, wobei automatisch ...

Zweite Stelle ist makeGui() von Move:
Code:
 public void makeGui() {
   
    x = new Xtreme();
   
  }
makeGui wird vom Konstruktor von Move aufgerufen, erzeugt ein Objekt xtreme, wodurch der xtreme Konstruktor aufgerufen wird, wodurch ein Objekt vom Typ Move erzeugt wird.




Ich weiß nicht, was du machen willst, aber ist generell eine schlechte Idee im Konstruktor einer Klasse ein Objekt einer davon abgeleiteten Klassen zu erstellen, sofern man nicht genau weiß, was man tut.
 
Was heißt denn verschiedene Klassen? :shock:

Move erbt doch von Xtreme. Also hat jede Instanz von Move
automatisch auch Zugriff auf alle Methoden/Attribute von Xtreme.

Ich glaube du hast das grundlegende Prinzip der Vererbung
noch nicht intus.

Edit: Ich schätze mal du brauchst eher eine hat-ein (Komposition)
als ein ist-ein (Vererbung) Beziehung.
 
Solche Exception treten auf wenn du eben von einer Methode die gleiche Methode (oder über 5 andere Methoden aufrufst)


Kann leicht vorkommen, wenn man Methoden überschreibt und man aber trotzdem das originale aufrufen möchte und dann super vergißt!

Wenn du da nicht schnell auf abbrechen drückst oder das wo umleitest, ist das so schnell weggepinselt (bzw gemüllt) das du nix mehr siehst!!
 
Das dürfte ein OutOfMemoryError sein.

Grund dafür ist definitiv der rekursive Methoden-Aufruf in dem "Wirr-Warr" deines Konzepts (sorry). Man erkennt das daran, das sich die Angaben der Zeilen periodisch wiederholen. Dieser rekursive Methodenaufruf (möglicherweise durch makeGui() hervorgerufen) muss unbedingt verschwinden.

cu Spacerat
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben