Java - Excepciones AYUDA

 
Vista:
sin imagen de perfil
Val: 21
Ha disminuido su posición en 46 puestos en Java (en relación al último mes)
Gráfica de Java

Excepciones AYUDA

Publicado por Jorge (7 intervenciones) el 02/06/2020 08:27:08
Este es programa que hice en NetBeans Java, sobre sacar el area y perimetro de figuras.
Ahora estamos viendo excepciones y me pidieron esto.

Utilizando el programa de figuras, en donde calculabas áreas y perímetros, modifícalo, de tal manera que implemente excepciones, de formato de número, que no acepte números negativo como medidas de las figuras. si existe alguna excepción mande un mensaje correspondiente
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
sin imagen de perfil
Val: 21
Ha disminuido su posición en 46 puestos en Java (en relación al último mes)
Gráfica de Java

Excepciones AYUDA

Publicado por Jorge (7 intervenciones) el 02/06/2020 15:40:41
Al implementar las excepciones, ya que es un tema que no vimos bien
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

Excepciones AYUDA

Publicado por Kabuto (1381 intervenciones) el 05/06/2020 20:25:12
Veamos por ejemplo la clase Cuadrado.
Dice que no admitamos valores negativos al setear base y altura. Si queremos generar una excepción cuando eso ocurra, podemos modificar los seters de la siguiente manera.
Marco en negrita los cambios:
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 Cuadrado extends Figura{
 
	private double base;
	private double altura;
 
	@Override
	public double CalcularArea() {
 
		return this.area=(base*altura);
	}
	@Override
	public double CalcularPerimetro() {
 
		return this.perimetro=(base*2)+(altura*2);
	}
	public double getBase() {
		return base;
	}
 
	public void setBase(double base) throws Exception {
		if (base < 0)
			throw new Exception("La base no puede tener valor negativo");
		else
			this.base = base;
	}
 
	public double getAltura() {
		return altura;
	}
 
	public void setAltura(double altura) throws Exception {
		if (altura < 0)
			throw new Exception("La altura no puede tener valor negativo");
		else
			this.altura = altura;
	}
 
}
Fíjate que esos dos métodos que hemos modificado, lanzarán una excepción cada una con un mensaje personalizado.

Bien, tras aplicar estos cambios en esta clase, ahora debemos OBLIGATORIAMENTE controla estas excepciones en el main principal.
Incluso si estás usando un IDE como Eclipse o NetBeans, probablemente veas que en la clase main ha saltado un aviso diciendo que tenemos excepciones sin controlar.

Para controlarlas, nos basta con rodear todo el código del case 1 en el switch, la parte de código donde creamos un Cuadrado, con un try catch.
En el catch, que es la parte de código que se ejecuta si ocurre una excepción, simplemente pondremos un JOptionPane de aviso mostrando el mensaje que retorna la Excepción que haya ocurrido.
Este mensaje dependerá de si lo ha generado al querer setear la altura, o querer generar la base.

El case 1, en el main, quedaría así.
Por cierto, para el bucle while no necesitas una variable i, basta con que uses la varaible op como condición del bucle

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
111
112
113
114
public class Main {
	public static void main(String[] args) {
 
		int op = 0;
		int Base, Altura, nL, apotema, ladob,radio;
		Cuadrado cuadrado = new Cuadrado();
		Poligono poligono = new Poligono();
		Romboide romboide = new Romboide();
		Rectangulo rectangulo = new Rectangulo();
		Circulo circulo = new Circulo();
		Triangulo_Equilatero triangulo_equilatero = new Triangulo_Equilatero();
		TrianguloRectangulo triangulorectangulo = new TrianguloRectangulo();
 
 
		do{
 
			op = Integer.parseInt(JOptionPane.showInputDialog(null, "Seleccione la figura deseada "
					+ "\n 1.-Cuadrado "
					+ "\n 2.-Poligono "
					+ "\n 3.-Romboide "
					+ "\n 4.-Rectangulo"
					+ "\n 5.-Circulo "
					+ "\n 6.-Triangulo Equilatero "
					+ "\n 7.-Triangulo Rectangulo "
					+ "\n 8.-Salir del menu"));
 
 
			switch(op){
			case 1:
				try {
					Altura = Integer.parseInt(JOptionPane.showInputDialog("Ingrese la altura del cuadrado"));
					cuadrado.setAltura(Altura);
					Base = Integer.parseInt(JOptionPane.showInputDialog("Ingrese la base del cuadrado"));
					cuadrado.setBase(Base);
					JOptionPane.showMessageDialog(null, "Area del cuadrado es: "+calcularArea(cuadrado));
					JOptionPane.showMessageDialog(null, "EL perimetro del cuadrado es: "+ calculaPerimetro(cuadrado));
				}
				catch(Exception e) {
					JOptionPane.showMessageDialog(null, e.getMessage(), "Ocurrio un error",
							JOptionPane.WARNING_MESSAGE);
				}
				break;
 
			case 2:
				Base = Integer.parseInt(JOptionPane.showInputDialog("Ingrese la base del poligono"));
				poligono.setBase(Base);
				nL = Integer.parseInt(JOptionPane.showInputDialog("Ingrese el numero de lados del poligono"));
				poligono.setnL(nL);
				apotema = Integer.parseInt(JOptionPane.showInputDialog("Ingrese el apotema del poligono"));
				poligono.setApotema(apotema);
				JOptionPane.showMessageDialog(null, "El area del poligono es:  "+calcularArea(poligono));
				JOptionPane.showMessageDialog(null, "El perimetro del poligono es: " + calculaPerimetro(poligono));
 
				break;
			case 3:
				Altura = Integer.parseInt(JOptionPane.showInputDialog("Ingrese la altura del Romboide"));
				romboide.setAltura(Altura);
				Base = Integer.parseInt(JOptionPane.showInputDialog("Ingrese el lado a del romboide "));
				romboide.setBase(Base);
				ladob = Integer.parseInt(JOptionPane.showInputDialog("Ingrese el lado b del romboide "));
				romboide.setLadob(ladob);
				JOptionPane.showMessageDialog(null, "El area del romboide es: "+ calcularArea(romboide));
				JOptionPane.showMessageDialog(null, "El perimetro del romboide es: "+calculaPerimetro(romboide));
				break;
			case 4:
				Altura = Integer.parseInt(JOptionPane.showInputDialog("Ingrese la altura del rectangulo"));
				rectangulo.setAltura(Altura);
				Base = Integer.parseInt(JOptionPane.showInputDialog("Ingrese la base del rectangulo"));
				rectangulo.setBase(Base);
				JOptionPane.showMessageDialog(null, "Area del rectangulo es: "+calcularArea(rectangulo));
				JOptionPane.showMessageDialog(null, "EL perimetro del rectangulo es: "+ calculaPerimetro(rectangulo));
				break;
			case 5:
				radio = Integer.parseInt(JOptionPane.showInputDialog("Ingrese el valor de Radio"));
				circulo.setRadio(radio);
				JOptionPane.showMessageDialog(null, "Area del circulo es: "+calcularArea(circulo));
				JOptionPane.showMessageDialog(null, "EL perimetro del rectangulo es: "+calculaPerimetro(circulo));
				break;
			case 6:
				Altura = Integer.parseInt(JOptionPane.showInputDialog("Ingrese la altura del Triangulo Equilatero"));
				triangulo_equilatero.setAltura(Altura);
				Base = Integer.parseInt(JOptionPane.showInputDialog("Ingrese la base del Triangulo Equilatero"));
				triangulo_equilatero.setBase(Base);
				JOptionPane.showMessageDialog(null, "Area del triangulo equilatero es: "+calcularArea(triangulo_equilatero));
				JOptionPane.showMessageDialog(null, "EL perimetro del triangulo equilatero: "+ calculaPerimetro(triangulo_equilatero));
				break;
			case 7:
				Altura = Integer.parseInt(JOptionPane.showInputDialog("Ingrese la altura del Triangulo Rectangulo"));
				triangulorectangulo.setAltura(Altura);
				Base = Integer.parseInt(JOptionPane.showInputDialog("Ingrese la base del Triangulo Rectangulo"));
				triangulorectangulo.setBase(Base);
				JOptionPane.showMessageDialog(null, "Area del Triangulo Rectangulo es: "+calcularArea(triangulorectangulo));
				JOptionPane.showMessageDialog(null, "EL perimetro del Triangulo Rectangulo es: "+ calculaPerimetro(triangulorectangulo));
				break;
 
			case 8:
				JOptionPane.showMessageDialog(null, "Hasta la proximaaaa");
				break;
			default: JOptionPane.showMessageDialog(null, "Opciion No Valida");
			}
 
		}while(op!=8);
	}
 
	public static double calcularArea(Figura f){ // polimorfismo
 
		return f.CalcularArea();
	}
	public static double calculaPerimetro(Figura f){ // polimorfismo
 
		return f.CalcularPerimetro();
	}
 
}

Con estos cambios, si ahora intentamos esto:

excepcion1

Ocurrirá una de las Excepciones que hemos implementado, y saldrá este mensaje de advertencia.

excepcion2

Y de esta forma tan sencilla, controlamos con excepciones que la base y la altura del Cuadrado reciba valores correctos.

Otra cosa que se pide controlar, es el formato de número. Es decir, que se introduzcan números correctos, nada de letras y símbolos raros ni tampoco una coma decimal (los datos se han de insertar con punto decimal, no coma decimal)

Este tipo de excepción, ya está creado por Java, y ocurre cuando pedimos que parsee el String que devuelve el JOptionPane al tipo de dato numérico que necesita nuestra clase.
Si al parsear, se encuentra una letra o símbolo raro que no es posible convertir en un número, salta una excepción específica llamada NumberFormatException.

Bien, como ya hemos puesto un try catch en nuestro case 1 del switch, en realidad ya estamos capturando esta excepción, porque con esta línea:
1
catch(Exception e)
Capturamos CUALQUIER excepción que se produzca.

Sin embargo, el mensaje que se muestra será un genérico prefijado por Java, y puede ser poco elegante e incluso no muy clarificador para que el usuario sepa en que se ha equivocado.
Si ahora intento esto:

excepcion3

Obtengo este mensaje:

excepcion4

Como dije, no es muy claro. A ver, no hay que ser muy listo para darse cuenta de que si te piden un número no puedes meter una frase je je..., pero esto es un ejemplo extremo. Pueden darse otras situaciones no tan evidentes y que el usuario se encuentre con un mensaje de error que no entiende y no podrá saber en qué se ha equivocado.

Lo que podemos hacer es añadir otro catch a nuestro try, un catch que se va a encargar de capturar SOLO la excepción del tipo NumberFormatException
Solo esa, que es la que se produce cuando se mete un valor imposible de parsear a un valor numérico.
De este modo, podemos mostrar nuestro propio mensaje para que sea más amigable para el usuario.

Este catch lo pondremos antes que el catch que pusimos antes.
Así, este primer catch capturará SOLO las excepciones de formato de número.
El resto de excepciones, las dejará pasar y las capturará el otro catch, que es quien captura TODO lo que no haya sido capturado por algún catch previo.
El case 1 queda así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
switch(op){
			case 1:
				try {
					Altura = Integer.parseInt(JOptionPane.showInputDialog("Ingrese la altura del cuadrado"));
					cuadrado.setAltura(Altura);
					Base = Integer.parseInt(JOptionPane.showInputDialog("Ingrese la base del cuadrado"));
					cuadrado.setBase(Base);
					JOptionPane.showMessageDialog(null, "Area del cuadrado es: "+calcularArea(cuadrado));
					JOptionPane.showMessageDialog(null, "EL perimetro del cuadrado es: "+ calculaPerimetro(cuadrado));
				}
				catch(NumberFormatException ex) {
					//Aqui solo capturamos excepciones al parsear String a valores numéricos
					JOptionPane.showMessageDialog(null, "Introduzca solo números sin símbolos y utilice el punto decimal",
							"Ocurrio un error", JOptionPane.WARNING_MESSAGE);
				}
				catch(Exception e) {
					//Aquí capturamos cualquier tipo de excepción, que no haya sido capturada por el primer catch
					JOptionPane.showMessageDialog(null, e.getMessage(), "Ocurrio un error",
							JOptionPane.WARNING_MESSAGE);
				}
				break;

Ahora, si intento la misma payasada de antes, tengo un mensaje menos confuso:

excepcion5

Pues con estas explicaciones, ya puedes tu mismo modificar el resto de clases de Figuras para que lancen excepciones.
Y ya sabes como modificar el main principal para recoger estas excepciones y que se muestren los mensajes de advertencia adecuados.

Cualquier duda, vuelve a preguntar
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