Fehlermeldung "Exception in thread "main" java.lang.NullPointerException"

SoloMid

Grünschnabel
Hey, ich bin gerade dabei ein Spielfeld mit nem bewegten Ball zu programmieren.

Hier ist der Quellcode der Klasse PingPong:

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class PingPong extends JPanel implements ActionListener{

	private Ball ball = new Ball(485, 240, this);
	private Image spielfeld;
	private Timer timer;
	
	public PingPong () {
		
		setBackground(Color.black);
		ImageIcon iiSF = new ImageIcon(this.getClass().getResource("Spielfeld.png")); 
		spielfeld = iiSF.getImage();
		
		timer = new Timer(15, this);
		timer.start(); 
	}
	
	
	 public void paint(Graphics g) {
	       super.paint(g);
 
	       g.drawImage(spielfeld, 0, 0, this);
	      
	       ball.paint(g);
	       
	       Toolkit.getDefaultToolkit().sync();
		    g.dispose();
	      }


	
	public void actionPerformed(ActionEvent e) {
		ball.moveBall(); 
		repaint(); 
		
	}
}

Hier die Klasse Frame:

Code:
import javax.swing.JFrame;    //JFrame komponenten

public class Frame extends JFrame{

  public static int x = 1000;
  public static int y = 500;
    
    public Frame() {
    
          add(new PingPong());                  // Verknüpfung zur Klasse game
          
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          setSize(x, y);                  //ingame Variablen breite:320 höhe:340, da 20 * 16 = 320 + RÄNDER
          setLocationRelativeTo(null);
          setTitle("Pong");

          setResizable(false);                // Größe unveränderbar
          setVisible(true);
    }
   
      public static void main(String[] args) {
          new Frame();
      }
      
}

Hier die Klasse Ball:

Code:
import java.awt.*;
import javax.swing.*;


public class Ball {

  private int x, y;
  
  private int velocityX, velocityY;
  Image ball;
  
  private Component component;
  
//----------------------------------------------------------------- 
  
  public Ball(int x, int y, Component component) {
    
    this.x = x;
    this.y = y;
    this.component = component;
    this.velocityX = 5;
    this.velocityY = 5;
    
    ImageIcon iiBall = new ImageIcon(this.getClass().getResource("Ball.png")); 
	ball = iiBall.getImage();
  }
  
//-----------------------------------------------------------------   
  
  public int getX() {
    return x;
  }
  
  public int getY() {
    return y;
  }
  
//----------------------------------------------------------------- 
  
  public void moveBall() {
    
    
    if (x + 50 > 1020) {
      velocityX = -5;
      
    } else if (x < 10) {
      
      velocityX = 5;
    }
    
    
    if (y + 40 > 480) {
      velocityY = -5;
      
    } else if (y < 10) {
      
      velocityY = 5;
    }
    
    x += velocityX;
    
    y += velocityY;
  }
  
//----------------------------------------------------------------- 
  
  public void paint(Graphics g) {
    g.drawImage(ball, x, y, component);
  }
}

Und die Fehlermeldung:

Code:
Exception in thread "main" java.lang.NullPointerException
	at javax.swing.ImageIcon.<init>(Unknown Source)
	at Ball.<init>(Ball.java:24)
	at PingPong.<init>(PingPong.java:7)
	at Frame.<init>(Frame.java:10)
	at Frame.main(Frame.java:22)

Ich bin wirklich ratlos und wäre über jede Hilfe dankbar.

Mfg
 
Hi

die Meldung sagt doch eigentlich genau, as los ist.

Ist das Programm in einer Jar-Datei, oder ...?
 
Naja tut mir leid .. aber ich versteh den Sinn der Fehlermeldung echt nicht ...

Ja ist sie ..

Kannst du mir zeigen was ich ändern muss damit es funktioniert ?
 
Der Sinn der Fehlermeldung allgemein (sie wird dir noch öfter begegnen!) ist, dass du auf eine Methode oder ein Attribut von einem Objekt zugreifen willst, dass es nicht gibt. Die einfachste Art die Meldung zu bekommen wäre
SomeClass x = null;
x.someArribute += 4;
Da x==null, kann auf "someAttribute" nicht zugegriffen werden, was zu einer NullPointerException führt. Ganz so offensichtlich ist es in der Realität natürlich dann auch nicht, sondern meist eher wie in deinem Fall. Hier gibt die Methode getResource() null zurück. Dies wird dann als Parameter an den Konstruktor von ImageIcon weitergegeben. (Soweit kein Problem, null-Pointer zu übergeben ist ja nicht verboten).

Nun will nur der Konstruktor wiederum irgendetwas damit machen und "merkt", dass er einen Pointer auf null in den Händen hält. Und an der Stelle hast du dann den Salat.

Du solltest sicherstellen, dass Ball.png existiert und nochmal recherchieren, wie das mit dem Verwenden von Resourcen aus jar-Dateien abläuft. (Also herausfinden was der Grund ist, warum getResource() null zurückgibt.) Ich kann's dir leider nicht genau sagen, weil ich das vor x Jahren das letzte mal gebraucht habe.

Viele Grüße,
Harrier
 
Was muss ich denn dann ändern ?

Tut mir wirklich leid, aber ich verstehe wirklich nicht was ich ändern soll ..
 

Neue Beiträge

Zurück