Java - Excepción línea 54 ¿Cómo corregirlo?

 
Vista:

Excepción línea 54 ¿Cómo corregirlo?

Publicado por jwhkadjh (1 intervención) el 18/06/2019 14:26:05
El resto de clases están bien programadas, pero no entiendo por qué me sale error a veces cuando lo ejecuto (otras veces me va bien)

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
package nueve;
 
import java.util.Scanner;
 
public class Main {
 
	public static void main(String[] args) {
		Scanner teclado = new Scanner (System.in);
		Disco uno = new Disco();
		Grupo dos = new Grupo();
		System.out.println("Introduce el título del disco:");
		uno.setTitulo(teclado.nextLine());
		System.out.println("Introduce el grupo que lo interpreta:");
		uno.setGrupo(teclado.nextLine());
		dos.setNombre(uno.getGrupo());
		do {
			System.out.println("Introduce el año de lanzamiento:");
			uno.setAñoLanzamiento(teclado.nextInt());
		}while(uno.getAñoLanzamiento()<=0);
		do {
			System.out.println("Introduce el precio de venta:");
			uno.setPrecioVenta(teclado.nextDouble());
		}while(uno.getPrecioVenta()<=0);
		do {
			System.out.println("Introduce el año de fundación del grupo:");
			dos.setAñoCreacion(teclado.nextInt());
		}while(dos.getAñoCreacion()<=0);
		do {
			System.out.println("Introduce el número de integrantes del grupo:");
			dos.setNumeroMiembros(teclado.nextInt());
		}while(dos.getNumeroMiembros()<=0);
		do {
			System.out.println("Introduce el número de canciones del disco:");
			uno.setNumeroCanciones(teclado.nextInt());
		}while(uno.getNumeroCanciones()<=0);
		Persona tres[] = new Persona[dos.getNumeroMiembros()];
		Cancion cuatro[] = new Cancion[uno.getNumeroCanciones()];
		for(int i=0;i<tres.length; i++) {
			tres[i] = new Persona();
			System.out.println("Introduce el nombre del integrante número "+(i+1));
			tres[i].setNombre(teclado.next());
			System.out.println("Introduce el apellido del integrante número "+(i+1));
			tres[i].setApellido(teclado.next());
			System.out.println("Introduce el año de nacimiento del integrante número "+(i+1));
			tres[i].setAñoNacimiento(teclado.nextInt());
		}
		System.out.println("Introduzca las canciones: ");
		for(int j=0;j<cuatro.length; j++) {
			cuatro[j]= new Cancion();
			System.out.println("Nombre de la canción número "+(j+1));
			cuatro[j].setTitulo(teclado.nextLine());
			teclado.next();
			System.out.println("Duración de la canción número "+(j+1)+" en segundos");
			cuatro[j].setDuracion(teclado.nextInt());
			}
		System.out.println();
		System.out.println();
		System.out.println(uno.toString());
		System.out.println();
		System.out.println(dos.toString());
		System.out.println("Miembros: ");
		for(int i=0; i<tres.length; i++) {
			System.out.println(tres[i].toString());
		}
		System.out.println();
		System.out.println("Lista de canciones: ");
		for(int i=0; i<cuatro.length; i++) {
			System.out.println();
			System.out.println((i+1)+cuatro[i].toString());
		}
		}
 
}

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
package nueve;
 
public class Disco {
	private String titulo;
	private int añoLanzamiento;
	private int numeroCanciones;
	private double precioVenta;
	private String grupo;
 
	public Disco() {
 
	}
 
	public void setTitulo (String titulo) {
		this.titulo=titulo;
	}
 
	public void setAñoLanzamiento (int añoLanzamiento) {
		this.añoLanzamiento=añoLanzamiento;
	}
 
	public void setNumeroCanciones (int numeroCanciones) {
		this.numeroCanciones=numeroCanciones;
	}
 
	public void setPrecioVenta (double precioVenta) {
		this.precioVenta=precioVenta;
	}
 
	public void setGrupo (String grupo) {
		this.grupo=grupo;
	}
 
	public String getTitulo() {
		return titulo;
	}
 
	public int getAñoLanzamiento() {
		return añoLanzamiento;
	}
 
	public int getNumeroCanciones() {
		return numeroCanciones;
	}
 
	public double getPrecioVenta() {
		return precioVenta;
	}
 
	public String getGrupo() {
		return grupo;
	}
 
	public String toString() {
		String mensaje="Disco: "+titulo+" ("+añoLanzamiento+") "+precioVenta+" €";
		return mensaje;
	}
}
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
package nueve;
 
public class Grupo {
	private String nombre;
	private int añoCreacion;
	private int numeroMiembros;
 
	public Grupo() {
 
	}
 
	public void setNombre (String nombre) {
		this.nombre=nombre;
	}
 
	public void setAñoCreacion (int añoCreacion) {
		this.añoCreacion=añoCreacion;
	}
 
	public void setNumeroMiembros (int numeroMiembros) {
		this.numeroMiembros=numeroMiembros;
	}
 
	public String getNombre() {
		return nombre;
	}
 
	public int getAñoCreacion() {
		return añoCreacion;
	}
 
	public int getNumeroMiembros() {
		return numeroMiembros;
	}
	public String toString() {
		String mensaje="Por: "+nombre+" ("+añoCreacion+")";
		return mensaje;
	}
}
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
package nueve;
 
public class Cancion {
	private String titulo;
	private int duracion;
 
	public Cancion() {
 
	}
 
	public void setTitulo (String titulo) {
		this.titulo=titulo;
	}
 
	public void setDuracion (int duracion) {
		this.duracion=duracion;
	}
 
	public String getTitulo() {
		return titulo;
	}
 
	public int getDuracion() {
		return duracion;
	}
 
	public String toString() {
		String mensaje=":"+titulo+" ("+duracion+" segundos)";
		return mensaje;
	}
}
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
package nueve;
 
public class Persona {
	private String nombre;
	private String apellido;
	private int añoNacimiento;
 
	public Persona() {
 
	}
 
	public void setNombre (String nombre) {
		this.nombre=nombre;
	}
 
	public void setApellido (String apellido) {
		this.apellido=apellido;
	}
 
	public void setAñoNacimiento (int añoNacimiento) {
		this.añoNacimiento=añoNacimiento;
	}
 
	public String getNombre() {
		return nombre;
	}
 
	public String getApellido() {
		return apellido;
	}
 
	public int getAñoNacimiento() {
		return añoNacimiento;
	}
 
	public String toString() {
		String mensaje="     "+nombre+" "+apellido+" ("+añoNacimiento+")";
		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 Jaime
Val: 80
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Excepción línea 54 ¿Cómo corregirlo?

Publicado por Jaime (39 intervenciones) el 18/06/2019 15:58:59
Hola compañero, brindaste muy poca información, pero por lo que veo el error radica en que no controlastes las excepciones al momento de ingresar datos con el objeto Scanner; es decir, en la linea 54 pediste que se ingresara un "int" para una fecha, que pueden entrar un caracter "/", ese es un ejemplo por lo que se puede lanzar una excepcion.
Es que a nosotros nos enseñaron a usar el objeto Scanner, pero no de forma correcta. El objeto Scanner, es mejor instanciarlo dentro de un try y así poder controlar los valores ingresados por el usuario.
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

Excepción línea 54 ¿Cómo corregirlo?

Publicado por Kabuto (1381 intervenciones) el 18/06/2019 19:35:14
No se si será el problema que tienes, pero comento que es muy habitual tener problemas cuando en un mismo programa leemos valores numéricos con nextInt(), o nextDouble()... y en alguna línea siguiente queremos leer un String con nextLine(). Es más que probable que ese nextLine() falle.

Mi consejo es que todas las lecturas de teclado las hagas usando nextLine() y si necesitas un valor numérico, lo parseas.

Si por ejemplo quieres un valor int, en lugar de:
1
int entero = teclado.nextInt();

Mejor hazlo así:
1
int entero = Integer.parseInt(teclado.nextLine());

O si quieres un double:
1
double real = Double.parseDouble(teclado.nextLine());


Esto te ahorrará problemas y además es similar a como se leen los datos numéricos en otros lenguajes como C# así que si algún día aprendes otros lenguajes estarás acostumbrado a esta dinámica.


Lo de usar un try catch como indicaba Jaime también estaría bien. Aunque si siempre tecleas tú los valores adecuados no es estrictamente necesario.
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
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Excepción línea 54 ¿Cómo corregirlo?

Publicado por Juan (70 intervenciones) el 19/06/2019 19:12:17
Buenas, te cuento un poco que es lo que creo que te pasa.

Lo mejor es que lo hagas como Kabuto dice, pero si no quieres hacerlo de ese modo te cuento el error.

El error que Kabuto comenta, que se da cada vez que usas un nextInt() y luego intentas leer un string y no puedes, es porque el nextInt() lee los datos numéricos pero deja el salto de linea (tecla intro) en el buffer. y al hacer luego un nextLine() te detecta ese salto de linea, y por eso no te deja escribir, lo toma como si ya escribiste.

El error que se te da a ti es el siguiente:
esta linea:

linea 45-tres[i].setAñoNacimiento(teclado.nextInt());

te deja el salto de linea en el buffer.

esta otra:

linea 50-System.out.println("Nombre de la canción número "+(j+1));
linea 51-cuatro[j].setTitulo(teclado.nextLine());

te lee ese salto de linea que se quedo ahí. y pasa a la siguiente instrucción:

linea 52-teclado.next(); y esta es la que te lee el nombre de la canción, no la linea anterior. y esta linea solo lee hasta el primer espacio en blanco, es decir.... si introduces como nombre "hola" no pasa nada y no te da error en la linea 54. pero si el nombre de tu canción es "Hermosa primavera" la instrucción teclado.next() solo te lee "Hermosa" y lo demás ("primavera") se queda en el buffer. y al ir a la siguiente linea:

linea 54-cuatro[j].setDuracion(teclado.nextInt());

en el buffer esta "primavera" lo lee y te intenta pasar eso a entero, evidentemente te da el error. Prueba poner el nombre de una canción sin espacios y veras que no te da error. y cuando pones nombres de canciones con espacios te dará error.

Solución: limpiar el buffer.

puedes cambiar la linea 52 ( teclado.next(); ) y poner teclado.nextLine() para que lea toda la linea y ponerla antes de la linea 51.

Quedaría así:

1
2
3
4
5
teclado.nextLine();
System.out.println("Nombre de la canción número "+(j+1));
cuatro[j].setTitulo(teclado.nextLine());
System.out.println("Duración de la canción número "+(j+1)+" en segundos");
cuatro[j].setDuracion(teclado.nextInt());

espero te ayude ;)
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