Java - Interface null AYUDA

 
Vista:

Interface null AYUDA

Publicado por Rocio (21 intervenciones) el 25/06/2022 01:51:00
hola buenas noches, me sale el sigueinte error: Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

depure mi codigo y el valor de una interface es null. alguien sabe como solucionar esto?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Interface null AYUDA

Publicado por Kabuto (1381 intervenciones) el 25/06/2022 18:50:17
Sin ver el código, no podemos decirte que hay que corregir.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Interface null AYUDA

Publicado por Rocio (21 intervenciones) el 25/06/2022 20:21:55
Clase AppCliente:
Código
import java.util.ArrayList;



import java.rmi.RemoteException;
import java.util.ArrayList;

import javax.swing.JOptionPane;
import Controlador.ControladorJuego;
import Vista.ControlVista;
import Vista.VistaConsola;
import Vista.VistaGrafica;
import ar.edu.unlu.rmimvc.RMIMVCException;
import ar.edu.unlu.rmimvc.cliente.Cliente;
import ar.edu.unlu.rmimvc.Util;
import Modelo.IJuego;
import Modelo.Juego;




//import cliente.Cliente;

public class AppCliente {

public IJuego miJuego;

public static void main(String[] args) throws RemoteException {
ArrayList<String> ips = Util.getIpDisponibles();;
String ip = (String) JOptionPane.showInputDialog(
null,
"Seleccione la IP en la que escuchará peticiones el cliente", "IP del cliente",
JOptionPane.QUESTION_MESSAGE,


null,
ips.toArray(),
null
);
String port = (String) JOptionPane.showInputDialog(
null,
"Seleccione el puerto en el que escuchará peticiones el cliente", "Puerto del cliente",
JOptionPane.QUESTION_MESSAGE,
null,
null,
9999
);
String ipServidor = (String) JOptionPane.showInputDialog(
null,
"Seleccione la IP en la corre el servidor", "IP del servidor",
JOptionPane.QUESTION_MESSAGE,
null,
null,
null
);
String portServidor = (String) JOptionPane.showInputDialog(
null,
"Seleccione el puerto en el que corre el servidor", "Puerto del servidor",
JOptionPane.QUESTION_MESSAGE,
null,
null,
8888
);


ControlVista vista = new VistaGrafica();
ControladorJuego controlador = new ControladorJuego(vista);
Cliente c = new Cliente(ip, Integer.parseInt(port), ipServidor, Integer.parseInt(portServidor));
vista.setControlador(controlador);
[color=red]vista.iniciar();[/color]
try {

c.iniciar(controlador);
} catch (RemoteException e) {
// TODO Auto-generated catch block

e.printStackTrace();
} catch (RMIMVCException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}



Clase AppServidor:

Código
import java.rmi.RemoteException;
import java.util.ArrayList;

import javax.swing.JOptionPane;

import Modelo.IJuego;
import Modelo.Juego;
import ar.edu.unlu.rmimvc.RMIMVCException;
import ar.edu.unlu.rmimvc.Util;
import ar.edu.unlu.rmimvc.servidor.Servidor;

public class AppServidor {



public static void main(String[] args) throws RemoteException {
ArrayList<String> ips = Util.getIpDisponibles();
String ip = (String) JOptionPane.showInputDialog(
null,
"Seleccione la IP en la que escuchará peticiones el servidor", "IP del servidor",
JOptionPane.QUESTION_MESSAGE,
null,
ips.toArray(),
null
);
String port = (String) JOptionPane.showInputDialog(
null,
"Seleccione el puerto en el que escuchará peticiones el servidor", "Puerto del servidor",
JOptionPane.QUESTION_MESSAGE,
null,
null,
8888
);


Juego modelo = new Juego();
System.out.println("Juego creado");
Servidor servidor = new Servidor(ip, Integer.parseInt(port));
try {
servidor.iniciar(modelo);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RMIMVCException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}



Clase jugador:
Código
import java.io.Serializable;
import java.util.ArrayList;

import Cartas.Cartas;
import Cartas.Mazo;
import Cartas.Palos;
import ar.edu.unlu.rmimvc.observer.ObservableRemoto;

public class Jugador implements Serializable {

public String nombre;
public int puntos=0;




public Jugador (String nombre){
this.nombre=nombre;
this.puntos=0;


}


Clase Juego

Código
public class Juego extends ObservableRemoto implements IJuego{



public ArrayList<Jugador> jugadores = new ArrayList<>();




public Juego() {
jugadorActual = 0;
ronda = 1;
}

public void iniciar() throws RemoteException {
estado=INICIANDO_JUEGO;
jugadorActual=0;
ronda=1;
notificarObservadores(1);
}



public void agregarJugador (String nombre) throws RemoteException {
jugadores.add(new Jugador(nombre));
notificarObservadores(2);

}

}


Interface IJuego:

Código
import java.io.EOFException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.StreamCorruptedException;
import java.rmi.RemoteException;
import java.util.ArrayList;

import Cartas.Cartas;
import Cartas.Mazo;
import ar.edu.unlu.rmimvc.observer.IObservableRemoto;

public interface IJuego extends IObservableRemoto {


void iniciar() throws RemoteException;

void jugando() throws RemoteException;

void agregarJugador(String nombre) throws RemoteException;
}


Controlador:


Código
public class ControladorJuego implements IControladorRemoto ;



private IJuego miJuego;
private ControlVista miVista;

public ControladorJuego(ControlVista miVista) throws RemoteException {
this.miVista = miVista;
miVista.iniciar();


}

public void agregarJugador(String nombre) throws RemoteException {
[color=red]miJuego.agregarJugador(nombre);[/color]
}

public String mostrarJugadores() throws RemoteException {
return miJuego.mostrarJugadores();
}

public void actualizar(IObservableRemoto modelo, Object queCambio) throws RemoteException{
int cambio = (int) queCambio;
switch (cambio) {
case 1:
break;
case 2:
System.out.println("Jugador agregado con exito");

break;
}

@Override
public <T extends IObservableRemoto> void setModeloRemoto(T arg0) throws RemoteException {
// TODO Auto-generated method stub

}

}



Clase vistaConsola:

Código
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Scanner;

import Vista.ControlVista;
import Controlador.ControladorJuego;
import Modelo.Juego;
import Modelo.Jugador;

public class VistaConsola implements ControlVista {


private static ControladorJuego miControl;

public void menu() throws RemoteException {
System.out.println("-------------------------");
System.out.println("- Configuración -");
System.out.println("-------------------------");
System.out.println("- M E N U -");
System.out.println("-------------------------");
System.out.println("- 1 - Agregar Jugador -");
System.out.println("- 2 - Mostrar Jugadores -");
System.out.println("- 3 - Iniciar Juego -");
System.out.println("-------------------------");
System.out.println(" ");

Scanner a = new Scanner(System.in);
int i = a.nextInt();
switch (i) {
case 1:
String nom="";
System.out.println("Ingrese nombre de jugador ");
Scanner sc = new Scanner(System.in);

nom = sc.nextLine();
[color=red]miControl.agregarJugador(nom);[/color]
break;
}


public void iniciar() throws RemoteException{
[color=red]menu();[/color]
}

@Override
public void setControlador(ControladorJuego controlador) throws RemoteException{
miControl = controlador;
}

}



Interface controlVista


Código
import java.io.IOException;
import java.rmi.RemoteException;

import Controlador.ControladorJuego;

public interface ControlVista {
void menu() throws RemoteException;
void setControlador(ControladorJuego controlador) throws RemoteException;
void iniciar() throws RemoteException ;
}




El error es:

Exception in thread "main" java.lang.NullPointerException
at Controlador.ControladorJuego.agregarJugador(ControladorJuego.java:)
at Vista.VistaConsola.menu(VistaConsola.java:)
at Vista.VistaConsola.iniciar(VistaConsola.java:)
at AppCliente.main(AppCliente.java:)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Interface null AYUDA

Publicado por Kabuto (1381 intervenciones) el 26/06/2022 11:44:37
El objeto estatico miControl no está inicializado.
Por eso tiene valor null, porque es solo una referencia que no apunta a ningún objeto

Lo marco en negrita:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class VistaConsola implements ControlVista {
 
 
private static ControladorJuego miControl;
 
public void menu() throws RemoteException {
System.out.println("-------------------------");
System.out.println("- Configuración -");
System.out.println("-------------------------");
System.out.println("- M E N U -");
System.out.println("-------------------------");
System.out.println("- 1 - Agregar Jugador -");
System.out.println("- 2 - Mostrar Jugadores -");
System.out.println("- 3 - Iniciar Juego -");
System.out.println("-------------------------");
System.out.println(" ");
 
Scanner a = new Scanner(System.in);
int i = a.nextInt();
switch (i) {
case 1:
String nom="";
System.out.println("Ingrese nombre de jugador ");
Scanner sc = new Scanner(System.in);
 
nom = sc.nextLine();
miControl.agregarJugador(nom);
break;
}

Habría que inicializarlo antes de intentar invocar sus métodos-
Para inicializarlo, veo en su constructor que tienes que pasarle un objeto ControVista.

Y como la clase donde ocurre todo esto, VistaConsola, es la que implementa la interfaz ControlVista
..., pues supongo que puedes inicializarlo así:

1
2
3
4
public class VistaConsola implements ControlVista {
 
 
private static ControladorJuego miControl = new ControladorJuego(this);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Interface null AYUDA

Publicado por Rocio (21 intervenciones) el 27/06/2022 02:06:32
El controlador lo inicializo con el metodo
@Override
public void setControlador(ControladorJuego controlador) throws RemoteException{
miControl = controlador;
}


cuando depuro el codigo me sale que miJuego vale null
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Interface null AYUDA

Publicado por Kabuto (1381 intervenciones) el 27/06/2022 10:54:47
Insisto.

En la porción de código que pongo aquí debajo, en la línea 4 declaras el objeto ControladorJuego miControl

Y luego en la línea 27 invocas un método de ese objeto.

Entre la línea 4 y la 27, dicho objeto no está siendo inicializado. Es tan solo una referencia que no apunta a nada, su valor es null
Por eso, se produce la excepción NullPointerException (puntero con valor nulo)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class VistaConsola implements ControlVista {
 
 
private static ControladorJuego miControl;
 
public void menu() throws RemoteException {
System.out.println("-------------------------");
System.out.println("- Configuración -");
System.out.println("-------------------------");
System.out.println("- M E N U -");
System.out.println("-------------------------");
System.out.println("- 1 - Agregar Jugador -");
System.out.println("- 2 - Mostrar Jugadores -");
System.out.println("- 3 - Iniciar Juego -");
System.out.println("-------------------------");
System.out.println(" ");
 
Scanner a = new Scanner(System.in);
int i = a.nextInt();
switch (i) {
case 1:
String nom="";
System.out.println("Ingrese nombre de jugador ");
Scanner sc = new Scanner(System.in);
 
nom = sc.nextLine();
miControl.agregarJugador(nom);
break;
}


¿Cómo se inicializar un objeto ControladorJuego?

Pues llamando a su constructor con la sentencia new ControladorJuego(), quien además exige recibir un objeto de clase ControlVista

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class ControladorJuego implements IControladorRemoto ;
 
 
 
private IJuego miJuego;
private ControlVista miVista;
 
public ControladorJuego(ControlVista miVista) throws RemoteException { //Constructor de objetos ControladorJuego
this.miVista = miVista;
miVista.iniciar();
}
 
public void agregarJugador(String nombre) throws RemoteException {
[color=red]miJuego.agregarJugador(nombre);[/color]
}
 
public String mostrarJugadores() throws RemoteException {
return miJuego.mostrarJugadores();
}
 
public void actualizar(IObservableRemoto modelo, Object queCambio) throws RemoteException{
int cambio = (int) queCambio;
switch (cambio) {
case 1:
break;
case 2:
System.out.println("Jugador agregado con exito");
 
break;
}
 
@Override
public <T extends IObservableRemoto> void setModeloRemoto(T arg0) throws RemoteException {
// TODO Auto-generated method stub
 
}
 
}

¿Y de donde sacamos un objeto ControlVista para poder construir ControladorJuego ?

Pues resulta que el objeto ControladorJuego, lo estamos declarando DENTRO de la clase VistaConsola que es precisamente quien implementa la interfaz ControlVista.

Así que podemos pasarle la referencia, usando la sentencia this.
Es decir, le decimos al objeto ControladorJuego, que el objeto ControlVista que necesita para su constructor, va a ser la propia clase donde está siendo declarado.

1
2
3
4
public class VistaConsola implements ControlVista {
 
 
private static ControladorJuego miControl = new ControladorJuego(this);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Interface null AYUDA

Publicado por Rocio (21 intervenciones) el 28/06/2022 22:10:53
Hago eso y me sigue dando el mismo error.

En el debug los valores que tienen el controlador, el juego y la vista son estos:

miControl= ControladorJuego (id=61)
miJuego= null
miVista= VistaConsola (id=52)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Interface null AYUDA

Publicado por Kabuto (1381 intervenciones) el 30/06/2022 10:28:59
Ufff.., es un programa extenso, me cuesta seguir el hilo de ejecución así a ojo...

El debug te dice que el objeto miJuego tiene valor null.

¿Será el atributo de esta clase ControladorJuego?
Parece que no se inicializa ni en el constructor ni por métodos...

1
2
3
4
5
6
7
8
9
10
11
public class ControladorJuego implements IControladorRemoto ;
 
 
 
private IJuego miJuego;
private ControlVista miVista;
 
public ControladorJuego(ControlVista miVista) throws RemoteException { //Constructor de objetos ControladorJuego
this.miVista = miVista;
miVista.iniciar();
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Interface null AYUDA

Publicado por Rocio (21 intervenciones) el 04/07/2022 06:07:32
Sisi. Es ese atributo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Interface null AYUDA

Publicado por Kabuto (1381 intervenciones) el 04/07/2022 10:25:25
Pues a ver, aquí hay un problema, porque IJuego NO es una clase, es una interfaz:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Interface IJuego:
 
Código
import java.io.EOFException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.StreamCorruptedException;
import java.rmi.RemoteException;
import java.util.ArrayList;
 
import Cartas.Cartas;
import Cartas.Mazo;
import ar.edu.unlu.rmimvc.observer.IObservableRemoto;
 
public interface IJuego extends IObservableRemoto {
 
 
void iniciar() throws RemoteException;
 
void jugando() throws RemoteException;
 
void agregarJugador(String nombre) throws RemoteException;
}

Tal vez ese atributo no debería ser IJuego. Debería ser Juego, que es la clase que implementa la interfaz IJuego

1
public class Juego extends ObservableRemoto implements IJuego

Entonces, prueba a cambiarlo por Juego, y sobre todo inicializarlo:

1
2
3
4
5
6
7
8
9
10
11
12
public class ControladorJuego implements IControladorRemoto ;
 
 
 
private Juego miJuego;
private ControlVista miVista;
 
public ControladorJuego(ControlVista miVista) throws RemoteException {
this.miJuego = new Juego();
this.miVista = miVista;
miVista.iniciar();
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Interface null AYUDA

Publicado por Rocio (21 intervenciones) el 04/07/2022 20:25:09
Gracias por tu tiempo. Eso ya lo intente y me crea un juego diferente para cada cliente. Estoy utilizando rmi. La instancia de la clase Juego la creo en la clase AppServidor
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar