Błąd przy wczytywaniu długości listy w KeyAdapterze

0

Mam problem. Gdy próbuję nacisnąć dowolny przycisk wyskakuje mi taki oto błąd:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at com.sarnecki.logics.KeyInput.keyPressed(KeyInput.java:18)
at java.awt.Component.processKeyEvent(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Wydaje mi się, że jest to związane z wartością handler.object.size() w KeyInput, ponieważ gdy próbuję jej użyć w System.out.println() w KeyInput, to nie działa. W innych miejscach tak.
Problem może być banalny, ale jestem początkujący. Z góry dziękuję za pomoc ;)

//KeyInput
package com.sarnecki.logics;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import com.sarnecki.logics.Handler;

public class KeyInput extends KeyAdapter {

	Handler handler = new Handler();
	
	public KeyInput(Handler handler){
		this.handler = handler;
	}
	
	public void keyPressed(KeyEvent e){
	int key = e.getKeyCode();

	for(int i =0; i < handler.object.size(); i++){
		
		GameObject tempObject = handler.object.get(i);
		if(tempObject.getId() == ObjectId.Player){
			if(key == KeyEvent.VK_D){
				//instrukcje
			}
		}
		
		
	}
	
	}
	
	
	
	public void keyReleased(KeyEvent e){
		
	}

       //Handler

package com.sarnecki.logics;

import java.awt.Graphics;
import java.util.LinkedList;

import com.sarnecki.main.GamePanel;
import com.sarnecki.objects.Block;


public class Handler {
	
	public LinkedList<GameObject> object = new LinkedList<GameObject>();
	
	private GameObject tempObject;
	
	public void update(){
		for(int i = 0; i < object.size(); i++){
			tempObject = object.get(i);
			
			tempObject.update(object);
		}
	}
	
	public void draw(Graphics g){
		for(int i = 0; i < object.size(); i++){
			tempObject = object.get(i);
			
			tempObject.draw(g);
		}

	}

	
	public void addObject(GameObject object){
		this.object.add(object);
	}
	public void destroyObject(GameObject object){
		this.object.remove(object);
	}
	public void createLevel(){
		for(int xx=0; xx < GamePanel.WIDTH*GamePanel.SCALE+32; xx+=64){
			addObject(new Block(xx, GamePanel.HEIGHT*GamePanel.SCALE-64, ObjectId.Block));
		}
	}
	

}
    	
}

0

Kodu trochę mało, może w chwili wywołania new KeyInput(handler), zmienna handler ma wartość null.

0

public KeyInput(Handler handler){
	this.handler = handler;
		
	if(handler == null){
		System.out.println("NULL");
	}
}

Zrobiłem coś takiego i podczas włączania gry w konsoli wyskakuje "NULL", więc raczej jest null xD Tylko nie za bardzo wiem co mogę inaczej zrobić by nie była. Wydaje mi się, że wszystko zrobiłem dobrze. Tak wygląda moja pętla gry. :

package com.sarnecki.main;

import java.awt.Dimension;
import java.awt.Graphics;
import com.sarnecki.logics.Handler;

import javax.swing.JPanel;

import com.sarnecki.logics.GameStateManager;
import com.sarnecki.logics.KeyInput;
import com.sarnecki.logics.MouseInput;


public class GamePanel extends JPanel implements Runnable{

	private static final long serialVersionUID = 1L;
	
	public static final int WIDTH = 400;
	public static final int HEIGHT = 240;
	public static final int SCALE = 3;
	private Thread thread;
	private int FPS = 60;
	private long targetTime = 1000 / FPS;
	private boolean running = false;
	Handler handler;
	private GameStateManager gsm;
	Graphics g;
	MouseInput mouse;
	
	public GamePanel(){
		super();
		setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
		setFocusable(true);
		requestFocus();
		init();
	}

	public void init(){
	running = true;	
	thread = new Thread(this);
	thread.start();
	this.addKeyListener(new KeyInput(handler));         ////////////TUTAJ DODAJĘ TEN KEYINPUT
	this.addMouseListener(new MouseInput());
	this.addMouseMotionListener(new MouseInput());

	}
	
	
public void run() {
	gsm = new GameStateManager();
	
	long start, elapsed, wait;
	while(running){
		start = System.nanoTime();
		
		update();
		repaint();
	
		elapsed = System.nanoTime() - start;	
		wait = targetTime - elapsed / 1000000;
		
		if(wait <= 0){wait = 5;}
		
		try{
			Thread.sleep(wait);
		}catch(Exception e){e.printStackTrace();}
			
	}

	}
	

	

	public void update(){
		gsm.update();

	}

	public void paintComponent(Graphics g){
		super.paintComponent(g);
		
		g.clearRect(0, 0, WIDTH * SCALE, HEIGHT * SCALE);

		
		gsm.draw(g);

	}


	
}

Jeżeli potrzeba więcej kodu to dam.
Bardzo dziękuję za pomoc ;)

0

Nigdzie nie TWORZYSZ tego handlera przecież. Masz tylko zadeklarowane pole ale w kodzie nigdzie nie ma new Handler() więc czego niby oczekujesz?

0

Masz rację ;) Niestety teraz object.size() zwraca wartość 0. Używam GameStateManagera który w zależności od wybranego stanu gry zmienia metody init(), draw() i update();. Sprawdziłem czy wszędzie tak jest, i gdy napiszę
this.addKeyListener(new KeyInput(handler));
na przykład w metodzie update() stanu gry w którym dodaję obiekty to zwraca wartość 21, czyli właściwą(w keyinput nadal się nie zmienia), bo tyle jest tych obiektów, zaś po przejściu do tego stanu z menu cały czas wyskakuje 0. W czym może tkwić błąd? Może problem jest tak oczywisty jak wcześniej, albo po prostu cały mój kod szwankuje, ponieważ posklejałem do kupy elementy których się nauczyłem z tutoriali z youtube, ponieważ w jednym nigdy nie było wszystkiego czego mi potrzeba.

0

Nie wiem ale przypuszczam że od początku źle to zrobiłeś.

0

Dzięki wielkie. Zrobię to wszystko jeszcze raz i przeanalizuję na spokojnie.

0

Chodziło o to, że dodałem keyListener przed dodaniem obiektów <FACEPALM>. Przynajmniej się czegoś nauczyłem dziś :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1