Object Null pointer exeption

D

Dingoman

Nun ich habe folgenes Problem:
Ich erstelle mehrer Objekte im Konstruktor einer Level-Klase, unter anderem auch eine Map;
Nun initialisiere ich diese Level Klasse in meiner haupt klasse. Um die erstellte Map auch anderen Klassen zu verfügung zu stellen, besitzt die Main Klasse eine Methode in der Form:
public Map getmap(){
return Level.getmap()
}
nun wenn ich diese Methode dann wieder in einer dritten Klasse aufrufe, bekomm ich eine Null Pointer Exeption. Aber eigentlich müsste Die map doch erstellt sein oder sieht die main klasse die Map nicht mehr durch Verschachtelung ? Ideen, Vorschläge und Links zu diesem Thema sind wilkommen !
danke
mfg dingoman :D
 
okay xD problem is das so viele klasse ineinander arbeiten aber ihr habt es so gewollt.
hier die Level klasse:
Java:
package LevelC;

import java.awt.Graphics;
import java.awt.geom.Rectangle2D;


import main.ScrollGame;

import tutorial.map.MapDisplay;
import Enemy.FactoryEnemySprite;
import Enemy.FactoryGrandma;
import Enemy.Grandma;
public class Level01 extends LevelI {
	Grandma G1[]=new Grandma[20];
	Grandma G2;
	public MapDisplay map;
	FactoryEnemySprite Enemy1Fac;
	FactoryGrandma Grandma1Fac;
	private boolean isStarted;
	public Level01(ScrollGame p){
		super(p);
		this.setStarted(true);
		this.map = new MapDisplay("level/newlevel.txt","pics/stars.gif","pics/shadow2.gif",1,1,parent,5,5);
		this.doIni();
		this.getMap().setVisibleRectangle(new Rectangle2D.Double(50,map.getHeight()-map.getHeight(),
				map.getWidth(),map.getHeight()));
	}
	public void doLogic(long delta){
		for(int i = 0;i<G1.length;i++){
			G1[i].doLogic(delta);
			}
		getMap().doLogic(delta);
	}
	public void drawLvl(Graphics g){
		if(isStarted()){
			g.draw3DRect(0, 0, 800, 600,false);
			getMap().drawVisibleMap(g);
			for(int i = 0;i<G1.length;i++){
				G1[i].drawObjects(g);
			}
		}
	}
	
	public void doIni(){
		

		Grandma1Fac = new FactoryGrandma(parent);
		G1 = Grandma1Fac.Create(20, 100, 50);
		
	}
	void setStarted(boolean isStarted) {
		this.isStarted = isStarted;
	}
	boolean isStarted() {
		return isStarted;
	}
	void setMap(MapDisplay map) {
		this.map = map;
	}
	public MapDisplay getMap() {
		return map;
	}
	
}
Meine Hauptklasse:
Java:
package main;



import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;

import Enemy.EnemySprite;
import Enemy.FactoryEnemySprite;
import Enemy.Grandma;
import LevelC.Level01;
import MainMenu.Mainmenu;

import tutorial.game.GamePanel;
import tutorial.map.MapDisplay;
import tutorial.player.*;
import tutorial.sprite.Sprite;
import tutorial.sprite.SpriteLib;
import tutorial.sound.MyClip;
import tutorial.sound.SoundLib;
public class ScrollGame extends GamePanel {

	private static final long	serialVersionUID	= 1L;
	private SpriteLib lib;
	SoundLib SoundL;
	Level01 L01;
	Car car;
	Weapon W;
	MyClip clip;
	BufferedImage startscreen;
	
	public static void main(String[] args) {
		new ScrollGame(800,600);
	}

	public ScrollGame(int w, int h) {
		super(w, h);
	}
	
	@Override
	protected void doInitializations() {
		setLib(SpriteLib.getInstance());
		startscreen = getLib().getSprite("pics/startscreen.gif");
		
		car = new Car(getLib().getSprite("pics/Airplane.gif",3, 1),400,300,200,this);
		L01=new Level01(this);
		W = new Weapon(getLib().getSprite("pics/W1.gif",1,1),200,200,200,this,50,6);
		
	}

	@Override
	protected void checkKeys() {
		
					
		getMap().moveMap(isUp(),down);
		car.setrotate(left,right);
		car.shoot(shoot, W);
		
	}

	@Override
	protected void doLogic() {
		car.doLogic(delta);
		L01.doLogic(delta);
		W.doLogic(delta);
	}

	@Override
	protected void moveObjects() {
		L01.getMap().moveVisibleRectangle(delta);
	}

	
	@Override
	public void render(Graphics g) {
		g.setColor(Color.red);
		if(isStarted()){
			car.drawObjects(g);
			L01.drawLvl(g);
			W.drawObjects(g);
			g.drawString("Angle: "+Long.toString(car.getAngle()),100,100);
			g.drawString("Hspeed: "+Long.toString(L01.getMap().getHspeed()),200,100);
			g.drawString("Vspeed: "+Long.toString(L01.getMap().getVspeed()),300,100);
		}else{
			g.drawImage(startscreen, 0, 0, this);
		}	
		g.drawString(Long.toString(getFps()),20,20);
		
	}
	
	public Car getPlayer(){
		return car;
	}
	
	public SpriteLib getSpritelib(){
		return getLib();
	}
 //hier ist wohl was falsch 
	public MapDisplay getMap(){
		return L01.getMap();
	}
	public Weapon getWeapon(){
		return W;
	}
	public EnemySprite getEnemys(int i){
		return null;
	}
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}


	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		
	}

	
	public void keyPressed(KeyEvent e) {
		
		if(e.getKeyCode()==KeyEvent.VK_UP){
			setUp(true);
		}

		if(e.getKeyCode()==KeyEvent.VK_DOWN){
			down = true;
		}

		if(e.getKeyCode()==KeyEvent.VK_LEFT){
			left = true;
		}

		if(e.getKeyCode()==KeyEvent.VK_RIGHT){
			right = true;
		}
		if(e.getKeyCode()==KeyEvent.VK_A){
			shoot = true;
		}
	}

	public void keyReleased(KeyEvent e) {
		
		if(e.getKeyCode()==KeyEvent.VK_UP){
			setUp(false);
		}

		if(e.getKeyCode()==KeyEvent.VK_DOWN){
			down = false;
		}

		if(e.getKeyCode()==KeyEvent.VK_LEFT){
			left = false;
		}

		if(e.getKeyCode()==KeyEvent.VK_RIGHT){
			right = false;
		}
		if(e.getKeyCode()==KeyEvent.VK_A){
			shoot = false;
		}

		if(e.getKeyCode()==KeyEvent.VK_ENTER){
			if(!isStarted()){
				setStarted(true);
				doInitializations();
			}
		}
		
		if(e.getKeyCode()==KeyEvent.VK_ESCAPE){
			if(isStarted()){
				stopGame();
			}else{
				setStarted(false);
				System.exit(0);
			}
		}
		
		
	}

	public void setLib(SpriteLib lib) {
		this.lib = lib;
	}

	public SpriteLib getLib() {
		return lib;
	}

	public Sprite getGrandma(int i) {
		// TODO Auto-generated method stub
		return null;
	}

	
}
Und hier die klasse in der methoden der map aufgerufen soll( wird über eine factory klasse erstellt)
Java:
package Enemy;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;


import main.ScrollGame;

import tutorial.game.GamePanel;
import tutorial.map.MapDisplay;
import tutorial.sprite.Sprite;
import tutorial.sprite.SpriteLib;
public class Grandma extends EnemySprite{
	private boolean isVisible;
	MapDisplay map;
	double xpos;
	double ypos;
	private boolean moveFlagleft;
	
public Grandma(BufferedImage[] i, double x, double y, long delay, ScrollGame p,double xpos,double ypos) {
		super(i, x, y, delay, p,xpos,ypos);
		}


	@Override
	public boolean collidedWith(Sprite s) {
		// TODO Auto-generated method stub
		return false;
	}
	
	public MapDisplay getMap(){
		return map;
	}
	
	public void move() {
		moveX();
		moveY();
	}
	
	private void moveX(){
		if(isVisible){
			if(parent.getMap().getDisplayX()>xpos+800){
			 moveFlagleft=true;
			 setLoop(0,2);
			} 
			if(parent.getMap().getDisplayX()<xpos){
			 moveFlagleft=false;
			 setLoop(3,5);
			} 
		}
		if(!isVisible){
			if(getX()>xpos+800){
				 moveFlagleft=true;
				 setLoop(0,2);
			} 
			if(getX()<xpos){
				 moveFlagleft=false;
				 setLoop(3,5);
			} 
		}
		if(!moveFlagleft){
			 setX(getX()+(parent.getFps()*2/parent.getFps())-(parent.getMap().getHspeed()/parent.getFps()));	 				 
		}
		if(moveFlagleft){	 
			setX(getX()-(parent.getFps()*2/parent.getFps())-(parent.getMap().getHspeed()/parent.getFps()));
		}
	 }    
	    
}
ich habe die vermutung das es nicht klappt weil ich im Konstruktor der Level Klasse die map erstelle und auch die Grandma Objekte. Sollte ich also im konstruktor nur die map erstellen und dann die Methode doIni später aufrufen ? :D thx
 
ja das wars wohl nur habe ich jetzt einen Null-pointer in der doLogic Methode des Levelobjektes, weil vermutlich G1 nich richtig initialisiert ist. hier ist die factory klasse :
Java:
package Enemy;
import main.ScrollGame;

public class FactoryGrandma {
	protected ScrollGame parent;
	public FactoryGrandma(ScrollGame p){
	this.parent= p;
	}
	
 public Grandma[] Create(int anzahl,int x, int firstPos)
	{
		Grandma[] Grandma = new Grandma[anzahl];
	 
	   for (int i=0 ; i<Grandma.length ; i++)
	      {
		   Grandma[i]= new Grandma(parent.getLib().getSprite("pics/Grandma.gif",6,1),200,200,200,parent,x,firstPos);
		   firstPos += 50;
	      }

	   return Grandma;
	}
}
 
Moin,

genau ... zudem wäre es extrem hilfreich, wenn Du auch die jeweilige Zeile angibst, in der die Exception auftritt (!)

Und was ist "GI" :confused::confused:

Gruß
Klaus
 
hai !
also G1 ist das Array in das ich die Grandma objekte in der doIni Methode in der Level Klasse(zeile 48)
reinhaue :]
die logic soll dann in der doLogic per schleife in der form
Code:
G1[i].dologic
abgerufen werden. Nur ist wohl G1 nicht initialisiert bzw. die objekte nich drin
mfg DINGOMAN
 
Moin,

in welcher doLogic() Methode tritt die NullPointerException auf? Die Method gibt es ja anscheinend auf ScrollGame, Level, Weapon und Car. Es wäre hilfreich, wenn du den Stacktrace der Exception mal hier anhängen könntest.

Gruß

soil
 
Zurück