0

Estoy haciendo mi proyecto y pues bueno al inicio tenía un ArrayList de enemigos, al momento de pasarlo a matriz me da este error, lo pasé a matriz porque debo cumplir con otras reglas y si lo hacía con arraylist no sería posible cumplir las reglas que me piden para el proyecto. si comento el método dibujar el error va a seguir pero esta vez en actualizar, que es para que se esté refrscando al pantalla para que se vaya dibujando en diferentes partes, por si mato un enemigo desparezca etc.

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Domain.Juego.dibujar(Juego.java:55)
    at GUI.JPAreaJuego.paintComponent(JPAreaJuego.java:32)

y sigue para abajo, pero lo demás no son errores en mi código solo esas 3 primeras adjunto el código que presenta errores.

import java.awt.Graphics;
import java.util.ArrayList;

public class Juego {

    private Jugador jugador;
    private Enemigos[][] enemigos;
    private Fondo fondo;
    private TanqueAntidoto tanqueAntidoto;
    private Blaster blaster;
    private Nivel nivel;
    
    public Juego() {
        this.blaster = new Blaster();
        this.jugador = new Jugador(blaster);
        this.enemigos = new Enemigos[30][40];
        this.fondo=new Fondo();
        this.tanqueAntidoto = new TanqueAntidoto();
        this.nivel = new Nivel();
        this.crearEnemigos();
        } // Constructor

    private void crearEnemigos() {
        
        for (int i = 0; i < nivel.aparicionVirus.length; i++) {
            for (int j = 0; j < nivel.aparicionVirus[i].length; j++) {
                
                if(Nivel.aparicionVirus[i][j] == 1) {

                    enemigos[i][j]= new CepaL(i,j);
                    
                }
                if(Nivel.aparicionVirus[i][j] == 2) {
                    this.enemigos[i][j]=new CepaS(i,j);
                    
                }
                
                if(Nivel.aparicionVirus[i][j] == 3) {
                    this.enemigos[i][j]=new CepaV(i,j);
                    
                }
                
            } // For j
        } // For i
    } // Crear Enemigos
    
    public void dibujar(Graphics g) {
        this.fondo.dibujar(g);
        this.jugador.dibujar(g);
        for (int i = 0; i < enemigos.length; i++) {
            for (int j = 0; j < enemigos.length; j++) {
                this.enemigos[i][j].dibujar(g);
            } // For    
        } // For
        
        
        
    } // Dibujar

    public void actualizar() {
        this.tanqueAntidoto.actualizar();
        this.jugador.actualizar();
        this.jugador.chequearAtaque(this.enemigos);
        for (int i = 0; i < this.enemigos.length; i++) {
            for (int j = 0; j < enemigos.length; j++) {
                this.enemigos[i][j].chequearAtaque(this.jugador);
            }
            
        } // for
    } // Actualizar

    // Setter && Getters

    public Jugador getJugador() {
        return jugador;
    }

    

    public void setJugador(Jugador jugador) {
        this.jugador = jugador;
    }

    public Enemigos[][] getEnemigos() {
        return enemigos;
    }

    public Fondo getFondo() {
        return fondo;
    }

    public TanqueAntidoto getTanqueAntidoto() {
        return tanqueAntidoto;
    }

    public Nivel getNivel() {
        return nivel;
    }

    public void setEnemigos(Enemigos[][] enemigos) {
        this.enemigos = enemigos;
    }

    public void setFondo(Fondo fondo) {
        this.fondo = fondo;
    }

    public void setTanqueAntidoto(TanqueAntidoto tanqueAntidoto) {
        this.tanqueAntidoto = tanqueAntidoto;
    }

    public void setNivel(Nivel nivel) {
        this.nivel = nivel;
    }

} // Class Juego

package GUI;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JPanel;

import Domain.Enemigos;
import Domain.Juego;

public class JPAreaJuego extends JPanel implements KeyListener,MouseListener {

    private Juego juego;

    public JPAreaJuego() {
        this.setPreferredSize(new Dimension(800, 600));
        this.setFocusable(true);
        this.requestFocus();
        this.addKeyListener(this);
        this.addMouseListener(this);
        
        this.juego = new Juego();
    } // JPanel del área de juego


    protected void paintComponent(Graphics g) {
        this.juego.dibujar(g);
        this.juego.actualizar();
        this.repaint();
    } // paintComponent
    
    public void keyPressed(KeyEvent e) {

        if (e.getKeyCode() == KeyEvent.VK_UP) {
            this.juego.getJugador().movimientoArriba();
        }
        
        if (e.getKeyCode() == KeyEvent.VK_DOWN) {
            this.juego.getJugador().movimientoAbajo();
        }
        
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            this.juego.getJugador().movimientoDerecha();
        }

        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            this.juego.getJugador().movimientoIzquierda();
        }
        
    } // Movimiento

    public void keyReleased(KeyEvent e) {
        
    }

    public void keyTyped(KeyEvent e) {

    } // Para las teclas
    
    public void mouseClicked(MouseEvent e) {
        
    }

    public void mouseEntered(MouseEvent e) {
        
    }

    public void mouseExited(MouseEvent e) {
        
    }
    
    public void mousePressed(MouseEvent e) {
        
        this.juego.getJugador().disparar(e.getX(), e.getY());
    }
    
    public void mouseReleased(MouseEvent e) {
        
    }

} // Class

los errores se presentan en el método para dibujar los enemigos en el JPanel, como dije antes cuando era un ArrayList no daba error ahora con la matriz me da error.

en el método dibujar y en el actualizar en la misma parte del for para ser más específico en el

for (int i = 0; i < enemigos.length; i++) {
            for (int j = 0; j < enemigos[0].length; j++) {
                this.enemigos[i][j].dibujar(g);
            } // For j
        } // For i

Ok, revisé la clase Nivel, que es una matriz compuesto de enteros de 0 a 3, donde 1,2,3 son diferentes tipos de enemigos, el 0 es un espacio vacío y me faltaban 2 filas, por eso me daba el error gracias a los que me comentaron y me hicieron notarlo, ahora si me pudiera seguir ayudando, ya que ahora me da este error que adjunto después de la clase nivel.

public class Nivel {
    public static int[][] aparicionVirus = {
            {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
            {1,2,1,3,0,0,0,0,0,0,0,3,1,0,1,0,1,3,0,1,0,0,0,1,3,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0},
            {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
            {0,0,0,0,0,0,1,0,0,3,0,3,0,0,0,1,2,0,1,2,0,0,2,0,0,0,1,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
            {0,3,2,0,1,0,0,0,2,1,0,0,2,0,0,1,2,0,1,2,0,0,2,0,3,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
            {0,0,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,1,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,1,0,0,1,0,2,1,0,3,0,0,0,1,2,0,1,2,0,1,2,0,0,2,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,3,2,0,1,0,0,0,2,1,0,0,2,0,0,1,2,0,1,2,0,0,2,0,3,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,0,0,0,0,0,1,0,0,3,0,3,0,0,0,1,2,0,1,2,0,0,2,0,0,0,1,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,1,0,0,1,0,2,1,0,3,0,0,0,1,2,0,1,2,0,1,2,0,0,2,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,3,2,0,1,0,0,0,2,1,0,0,2,0,0,1,2,0,1,2,0,0,2,0,3,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,0,0,0,0,0,1,0,0,3,0,3,0,0,0,1,2,0,1,2,0,0,2,0,0,0,1,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},
            {0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2,0,1,2,0,0,0,0,0,2,1,0,3,2,0,0,1,2,0,1,2},};
} // Clase Nivel

Este error es en la creación de enemigos.

 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 30 out of bounds for length 30
        at Domain.Juego.crearEnemigos(Juego.java:33)

Para ser más preciso en esta parte

for (int i = 0; i < nivel.aparicionVirus.length; i++) {
                for (int j = 0; j < nivel.aparicionVirus[i].length; j++) {
                    
                    if(Nivel.aparicionVirus[i][j] == 1) {
                        enemigos[i][j]= new CepaL(i,j);
                    }
                    if(Nivel.aparicionVirus[i][j] == 2) {
                        this.enemigos[i][j]=new CepaS(i,j);
                    }
                    
                    if(Nivel.aparicionVirus[i][j] == 3) {
                        this.enemigos[i][j]=new CepaV(i,j);
                    }
                } // For j
            } // For i

me lo da cuando creo un nuevo enemigo.

carlos zamora
  • 307
  • 1
  • 12
  • ¿Responde esto a tu pregunta? [¿Cuál es la solución a todos los errores NullPointerException presentes, pasados y futuros?](https://es.stackoverflow.com/questions/42977/cu%c3%a1l-es-la-soluci%c3%b3n-a-todos-los-errores-nullpointerexception-presentes-pasados) – padaleiana Nov 05 '20 at 16:52
  • los NPE son por no inicializar valores, lo que no entiendo es eso, en qué momento estoy equivocándome, porque lo único que hice fue cambiarlo de arraylist a matriz y cuando era arraylist funcionaba al 100% – carlos zamora Nov 05 '20 at 17:12
  • 1
    ya intentaste remplazar por `j < enemigos[0].length` en el for interno? – Ruslan López Nov 05 '20 at 17:24
  • mismo error, lo acabo de intentar pero no funcionó :/ – carlos zamora Nov 05 '20 at 18:02
  • 1
    Revisar: 1. Las dimensiones de `enemigos` son 30 x 40 `nivel.aparicionVirus` Tiene las mismas dimensiones? 2. Los enemigos se crean según una condición `aparicionVirus[i][j] == 1 || 2 || 3` Siempre se va a cumplir que la condición sea 1 2 o 3? de no cumplirse puede dejar espacios del arreglo sin asignar. – Lobos Nov 05 '20 at 18:25
  • Agrega tu código de Nivel, tal vez allí está el problema – Ruslan López Nov 05 '20 at 18:46

1 Answers1

1

NullPointerExcepcion se produce por esto:

   for (int j = 0; j < nivel.aparicionVirus[i].length; j++) {

    if (Nivel.aparicionVirus[i][j] == 1) {
        enemigos[i][j] = new CepaL(i, j);
    }
    if (Nivel.aparicionVirus[i][j] == 2) {
        this.enemigos[i][j] = new CepaS(i, j);
    }

    if (Nivel.aparicionVirus[i][j] == 3) {
        this.enemigos[i][j] = new CepaV(i, j);
    }
} // For j

Cuando en aparicivonVirus el valor es 0 ese espacio en enemigos queda null.

La solución sería evaluar que enemigos[i][j] no sea null:

if(this.enemigos[i][j] != null)
    this.enemigos[i][j].dibujar(g);

ArrayIndexOutOfBoundsException Se produce porque las dimensiones de aparicionVirus son 31 x 40 y las de enemigos son 30 x 40.

Lobos
  • 14,463
  • 3
  • 9
  • 28
  • listo, eso me va a evitar el Null Pointer Exception, gracias me podría ayudar con el error de abajo, el de index out of bounds – carlos zamora Nov 05 '20 at 20:02