Java - Exception in thread "main" java.lang.NullPointerException a

 
Vista:

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

Publicado por Makiman (14 intervenciones) el 16/06/2019 13:35:09
¿PUEDEN ENCONTRAR EL ERROR Y AYUDARME A CORREGIRLO?
Son dos clases que simulan una agenda telefónica.
Muchísimas gracias de antemano.

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package cuatro;
 
import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
		Scanner teclado = new Scanner (System.in);
		Contacto uno[] = new Contacto[10];
		int n=1;
		int p=0;
		int j=0;
		do{
			System.out.println("Bienvenido a la agenda de contactos");
			System.out.println("Para registrar un contacto, pulse 1");
			System.out.println("Para ver un contacto, pulse 2");
			System.out.println("Para borrar la agenda, pulse 3");
			System.out.println("Para cerrar la agenda, pulse 0");
			p=teclado.nextInt();
			switch (p){
				case 1:
					j++;
					System.out.println("Introduzca el nombre");
					uno[j].setNombre(teclado.next());
					System.out.println("Introduzca el apellido");
					uno[j].setApellido(teclado.next());
					System.out.println("Introduzca la edad");
					uno[j].setEdad(teclado.nextInt());
					System.out.println("Introduzca el numero");
					uno[j].setNumero(teclado.nextInt());
					System.out.println("CONTACTO GUARDADO");
				break;
				case 2:
					System.out.println("Introduzca el número de contacto que desea visualizar");
					int i=0;
					i=teclado.nextInt();
					System.out.println(uno[i].toString());
				break;
				case 3:
					System.out.println("¿Está seguro de que lo desea borrar(true)?");
					boolean confirmar=false;
					confirmar=teclado.hasNextBoolean();
					if (confirmar==true) {
						for (int k=0; k<=10; k++) {
							uno[k]=null;
						}
					}
					else {
						System.out.println("OPERACIÓN CANCELADA");
					}
				break;
				case 0:
					n=0;
				break;
				default:
					System.out.println("OPERACIÓN INVÁLIDA");
				break;
			}
		}while(n>0);
		System.out.println("CERRANDO CALCULADORA...");
		System.out.println("Gracias por utilizar nuestros servicios.");
	}
 
}
 
 
package cuatro;
 
public class Contacto {
	protected String nombre=null;
	protected String apellido=null;
	protected int edad=0;
	protected int numero=0;
	public boolean mayorEdad() {
		boolean resultado=false;
		if(edad>=18) {
			resultado=true;
		}
		return resultado;
	}
	public Contacto() {
	}
	public void setNombre (String nombre) {
		this.nombre=nombre;
	}
	public void setApellido (String apellido) {
		this.apellido=apellido;
	}
	public void setEdad (int edad) {
		this.edad=edad;
	}
	public void setNumero (int numero) {
		this.numero=numero;
	}
	public String getNombre() {
		return nombre;
	}
	public String getApellido() {
		return apellido;
	}
	public int getEdad() {
		return edad;
	}
	public int getNumero() {
		return numero;
	}
	public String toString() {
		String mensaje="El contacto se llama "+nombre+" "+apellido+" tiene "+edad+" años y su número es "+numero;
		return mensaje;
	}
}
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 Rodrigo
Val: 2.041
Plata
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

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

Publicado por Rodrigo (623 intervenciones) el 16/06/2019 18:14:42
3 sugerencias:
- cuando escribas un error o una excepcion, escribe el mensaje completo, no solo 1 linea, tipicamente las excepciones te indican mas que lo que has puesto aqui, incluso te indican a veces el numero de linea, la funcion que se estaba ejecutando, etc.
- Cuando iteras un arreglo de tamano n, el indice va de 0 a n-1. Tienes un ciclo for ahi que itera el arreglo de tamano 10 desde 0 a 10. Tiene qiue ser de 0 a 9. Tipicamente se hace
1
for(int i = 0; i < n; i++ )
- Cuando pongas codigo aqui, usa las herramientas que aparecen justo arriba, una que aparece con este icono </>, asi el codigo aparece con numero de linea y no se pierden los espacios en blancos que ayudan a seguir el codigo y ayudarte mejor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

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

Publicado por makiman (14 intervenciones) el 17/06/2019 11:25:09
Muchísimas gracias. El programa funciona ya correctamente gracias a tus consejos.
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

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

Publicado por Kabuto (1381 intervenciones) el 16/06/2019 21:35:17
Por otro lado, en esta linea incializas el array de 10 Contactos.
1
Contacto uno[] = new Contacto[10];

Pero no inicializas los 10 Contactos.
Esos 10 objetos ahora mismo tienen valor null.
Tendrías que inicializaros llamando a su constructor a cada uno. Con un bucle lo haces fácil
1
2
for (int i = 0; i < uno.length; i++)
    uno[i] = new Contacto();


U otra opción sería inicalizarlos de uno en uno, ya dentro del switch, cuando eligen la opción 1 de registrar contacto nuevo. Pero antes de intentar setear nada, de lo contrario te salda la NullPointerException.
Por cierto, esa variable j que usas como indice para el array, debería incrementarse DESPUES de haber registrado el nuevo contacto, no ANTES.
Si la incrementas ANTES, nunca se guardará nada en la posición [0], porque siempre empezarás en la posición [1].
Y además no estás controlando si has alcanzado ya el tope del array que es un máximo de 10 contactos, si el usuario intenta registrar a un contacto número 11, deberías advertirle que no es posible, pues de lo contrario el programa intentará guardar un contacto en posiciones del array que excenden sus límites

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
case 1:
if ( j < uno.length) { //Aun queda sitio para guardar contactos
    uno[j] = new Contacto(); //Inicializamos el Contacto, si no lo hemos hecho ya antes con el bucle
    System.out.println("Introduzca el nombre");
    uno[j].setNombre(teclado.next());
    System.out.println("Introduzca el apellido");
    uno[j].setApellido(teclado.next());
    System.out.println("Introduzca la edad");
    uno[j].setEdad(teclado.nextInt());
    System.out.println("Introduzca el numero");
    uno[j].setNumero(teclado.nextInt());
    System.out.println("CONTACTO GUARDADO");
    j++; //Se incrementa cuando ya se ha guardado el contacto
}
else
    System.out.println("Se ha alcanzado el límite de 10 contactos. No se puede registrar un nuevo contacto");
break;


Para borrar la agenda, como ha dicho el compañero, ese bucle te va a dar error por la condicion que tiene puesta.
Pero de todos modos, no necesitas ningún bucle. Basta con inicializar de nuevo el array.

1
2
3
4
5
6
7
case 3:
System.out.println("¿Está seguro de que lo desea borrar(true)?");
boolean confirmar=false;
confirmar=teclado.hasNextBoolean();
if (confirmar==true) {
    uno = new Contacto[10]; //Esto ya reinicializa el array sin tener que usar un bucle.
}

Esto como digo, reinicializa el array, pero no los Contactos.
Los Contactos se tendrá que inicializar en la opción 1 del switch como en el código que he puesto antes, o bien con otros bucle como en el ejemplo que pues al principio.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

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

Publicado por Makiman (14 intervenciones) el 17/06/2019 11:26:13
Muchas gracias por tu dedicación y tus consejos. Los seguiré con el fin de mejorar en mis futuros programas.
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