• Compra una licencia de Windows 10/11 (10€) u Office (18€) al mejor precio u Office al mejor precio. Entra en este post con las ofertas
  • Conoce los Días Naranjas de PcComponentes: descuentos de hasta un 40% en tecnología. Entra en este post con las ofertas
  • ¡Bienvenid@! Recuerda que para comentar en el foro de El Chapuzas Informático necesitas registrar tu cuenta, tardarás menos de 2 minutos y te dará valiosa información además de ayudarte en lo que necesites o pasar un rato agradable con nosotros.

AYUDA Problema Unreachable statement, programando en Java

SergiKyo96

De profesión Chapuzas
Registrado
25 Jun 2014
Mensajes
295
Puntos
18
A ver, el caso es que estoy realizando una tarea, y tengo un error un poco extraño, a ver si alguna alma caritativa pudiera decirme porque me salta el Unreachable Statement, en el return del método validarMarca, que consiste en comprobar si dadas las marcas de coches si la que le paso coincide,tiene que ser alguna tontería, pero no consigo encontrarlo.

import java.io.*;

public class Coche implements Serializable{

/** declaracion de los atributos estaticos */
private static final String[] MARCAS = {
"BMW", "CITROEN", "DACIA", "FIAT", "FORD", "PEUGEOT",
"RENAULT", "SEAT", "VOLKSWAGEN", "VOLVO"};
private static final char[] VOCALES = {'A', 'E', 'I', 'O', 'U'};
private static final int CILINDRADA_MIN = 900;
private static final int CILINDRADA_MAX = 3000;
private static final int PUERTAS_MIN = 2;
private static final int PUERTAS_MAX = 5;
private static final long serialVersionUID = -7143657398023718689L;

/** declaracion de los atributos de instancia */
private String marca;
private String matricula;
private int cilindrada; // cilindrada en cc
private int puertas; // numero de puertas
private boolean aa; // aire acondicionado
private boolean abs; // frenos abs

/** constructor */
public Coche(String marca, String matricula,
int cilindrada, int puertas,
boolean aa, boolean abs) {
this.marca = marca.toUpperCase();
this.matricula = matricula.toUpperCase();
this.cilindrada = cilindrada;
this.puertas = puertas;
this.aa = aa;
this.abs = abs;
}

/** metodo toString */
public String toString() {
return "-----------------------\n"
+ "marca: " + marca + "\n"
+ "matricula: " + matricula + "\n"
+ "cilindrada: " + cilindrada + "\n"
+ "puertas: " + puertas
+ ((aa) ? "\naire acondicionado" : "")
+ ((abs) ? "\nfrenos abs" : "");
}

/** metodo validar
* @throws CocheException
* @throws RangoException */
public boolean validar() throws CocheException, RangoException {
/** la siguiente instruccion return
* se ha escrito exclusivamente para que la clase compile
*/
return true;

/** la siguiente instruccion return
* es la implementacion correcta de este metodo
*
* por tanto, hay que implementar los metodos
* validarMarca, validarMatricula,
* validarCilindrada, validarPuertas
*/

return validarMarca()
&& validarMatricula()
&& validarCilindrada(CILINDRADA_MIN, CILINDRADA_MAX)
&& validarPuertas(PUERTAS_MIN, PUERTAS_MAX);

}

/** metodo validarMarca */
private boolean validarMarca() throws MarcaDesconocida {

for (int i = 0; i<MARCAS.length ; i++){
if (MARCAS.equals(marca) == true) return true;
else throw new MarcaDesconocida ("Error");
}
return false;

}
/** metodo validarMatricula */
private boolean validarMatricula(){
return true;
}
/** metodo validarCilindrada */
private boolean validarCilindrada(int CILINDRADA_MIN, int CILINDRADA_MAX) throws RangoException{
if (cilindrada>= CILINDRADA_MIN && cilindrada<= CILINDRADA_MAX) return true;
else throw new RangoException("Error, potencia no valida");
}
/** metodo validarPuertas */
private boolean validarPuertas(int PUERTAS_MIN, int PUERTAS_MAX) throws RangoException{
if (puertas>= PUERTAS_MIN && puertas<= PUERTAS_MAX) return true;
else throw new RangoException("Error, numero de puertas inadecuado");
}
}


El metodo validarMatricula, aun no lo he hecho pero de todas formas, no debería saltarme nada
 
Te lo subo que ni idea.
 
Jo, se me olvidó mirarlo esta tarde...

Hace un año que no toco Java (es más yo también tuve el problema del coche) pero creo que te falta un this.marca en el equals... Creo.

MotoEizando el foro
 
Ya veo el error.

Tienes en el for, un return true y un throw. ¿Que pasa si el primero no cumple el if? Que salta el throw.

Mejor que un return true, sería que si el if es correcto, asignas true a una variable y pones un break para que salga del bucle.
Después, fuera del bucle, pones return y la variable booleana de antes.

MotoEizando el foro
 
Te recomiendo que prestes más atención al estilo del código y que sigas siempre las mismas pautas (tabulaciones, posición de las llaves, espaciado, etc).

Código:
private boolean validarMarca() throws MarcaDesconocida {

	for (int i = 0; i < MARCAS.length; i++) {
		if (MARCAS[i].equals(marca) == true) {
			return true;
		} else {
			throw new MarcaDesconocida("Error");
		}
	}
	
	return false;

}

No entiendo muy bien tu planteamiento. Estás mezclando dos formas de tratamiento de errores: validación true/false y excepciones. La validación no debería lanzar una excepción, sino devolver true o false, y eso ya se utilizará en alguna otra parte del código para lanzar la excepción o para ejecutar otras secciones de código, pero no tiene sentido que para validar lances una excepción *y* retornes true o false.

Idea 1:

Código:
private boolean validarMarca() {
	
	boolean encontrada = false;

	for (int i = 0; i < MARCAS.length; i++) {
		if (MARCAS[i].equals(marca)) {
			encontrada = true;
			break;
		}
	}
	
	return encontrada;

}

Cuando puedes lanzar la excepción es durante el constructor, si alguno de esos métodos de validación devuelve false.

Por otro lado, supongo que lo estáis haciendo así por motivos didácticos, pero no sé si tiene mucho sentido usar tantas clases distintas de excepción para errores que son esencialmente iguales: errores de validación.

Quiero decir, normalmente utilizas distintas clases hijas de Exception si tus errores reciben tratamiento diferente (error con la base de datos, error de lógica, error de ficheros, error de entrada de usuario...), pero para errores de validación de datos lanzarías UN tipo de excepción (DataValidationException, por ejemplo), no MarcaDesconocida, RangoException, etc. Teniendo en cuenta también lo que digo de que un método que valida, debe retornar true o false *o* lanzar excepción, pero no ambas.

Trata de llamar a las excepciones siempre LoQueSeaException, es otra convención no escrita.

Por cierto, ¿seguro que NUNCA vas a escribir una clase hija de Coche? Esos private... La visibilidad protected está infravalorada ;)
 
Ya te lo han dicho, basicamente es eso.
El metodo saca un true o una excepción, nunca llega al return false.
 
Arriba