¿Que le ocurre a mi codigo? JAVA

FrUcTuS

Hola amigos ¿que tal?, estoy comenzando a trabajar con objetos en JAVA y estoy realizando un simple ejercicio para obtener el precio y otras características de un coche pidiendo al usuario ingresar la marca y el modelo.

Todo compila perfectamente pero no se me muestran los resultados ingresados en la consola.

CODIGO

El programa solo esta hecho por ahora para recibir el valor "BMW" en marca e introducir a, b, c, d en modelo.

Introduciendo los valores correctos:
Marca: BMW
Modelo: a
Color: Rojo

Se obtiene este resultado:

Su coche seleccionado es un BMW el modelo es [a] tiene 0 puertas un motor de 0 cvs y cuesta 0.0€

Recibe la marca, el modelo pero no modifica las variables del Switch. No muestra error tampoco.

¿Que puede ocurrir? Gracias

bornex

#1 Así a bote pronto y rapido, el fallo esta en el == al comparar String. En Java los String son una clase y se comparan a través del método equals.

if(marca.toUpperCase().equals("BMW")){

1 2 respuestas
FrUcTuS

#2 Gracias Crack empecé hace 2 semanas y tengo un buen lio montado con otros lenguajes.

:cry: :cry: :cry:

1 respuesta
B

#3 Con qué programas? Muchas IDEs te dan el warning en casos como este porque es muy fácil equivocarse (es sintácticamente correcto y tiene un significado semántico también).

1 respuesta
Ranthas

#1 En Java, el operador de igualdad (==) establece un valor verdadero si las dos referencias de dos objetos son iguales. ¿Qué significa esto?

String strEjemplo_1 = "El gato hace miau";
String strEjemplo_2 = "El gato hace miau";

A primera vista puedes pensar que tienes dos objetos, strEjemplo_1 y strEjemplo_2, y que ambos "tienen" el valor "El gato hace miau". Esto es incorrecto. En el heap tienes únicamente almacenado una vez la cadena "El gato hace miau", y en las variables strEjemplo_1 y strEjemplo_2 tienes una referencia al espacio de memoria donde está localizada la cadena.

Como ese espacio de memoria es el mismo para ambas, si haces strEjemplo_1 == strEjemplo_2, el compilador no da error y además, te devuelve un true como un burro.

1 1 respuesta
FrUcTuS

#4 Eclipse Java Neon

#5 Vaaaaaale Muy buena esa, me lo deja claro.

Gracias bros!

1 comentario moderado
daviletor

#1 No sé si conocerás el depurador de Eclipse, donde puedes ejecutar instrucciones paso a paso e ir viendo el valor de las variables en cada instante. Si no es así, te recomiendo que aprendas a usarlo, te sacará de más de un apuro.

#2 Otra forma...

if(marca.equalsIgnoreCase("BMW")){

que directamente compara ignorando mayúsculas de minúsculas

2 respuestas
FrUcTuS

#8 Pues no tengo costumbre de usarlo sinceramente, empezare a ver lo que me puede ofrecer. :cry:

Os dejo otra duda pls que estoy buscando el error por google a diestra y siniestra y no encuentro nada.

for(int i=0;i < mivar.length();i++){
			
		boolean v = false;
		
		if(mivar.charAt(0) == 'P' || mivar.charAt(i) == 'W'){
			v = true;
		}

The operator && is undefined for the argument type's boolean, char...

Simplemente quiero convertir el bool en true si el primer carácter introducido es P o si encuentra la letra W a lo largo del texto. Pero solo puedo poner una condición en el IF ya que no puedo usar los operadores para añadir mas condiciones.

¿Como se hace esto en JAVA? ¿Que se utiliza?

Gracias de nuevo! Son ejercicios para un curso de JAVA espero que merezca la pena este dolor de cabeza!! Jejeje

2 respuestas
Yandr0s

#9 Ahi tienes varios fallos, algunos de concepto y otros de sintaxis:

1) estas declarando el boolean v dentro del bucle for: Por lo que por cada iteracion del bucle estas creando una una nueva variable diferente de la anterior
º
2) Estas comprobando si el primer caracter es P una y otra vez en cada iteracion

3) En la condicion del if necesitas poner cada una de las condiciones entre parentesis. De lo contrario el compilador piensa que estas poniendo: SI el el primer caracter es: "P" o el resultado de comprobar si el caracter i es W.

Posible solucion:

Declarar el boolean fuera y comprobar primero si el primer caracter es P fuera del bucle. Y si no es cierto, haces el bucle comprobando unicamente la segunda condicion.

(Se podria mejorar algo mas, pero tampoco es plan de liarlo demasiado )

1 respuesta
FrUcTuS

#10

  1. Si por eso no pasa nada esta declarado fuera, era para no pegar todo el código jeje Pero llevas toda la razón que ahí no es lo mismo que arriba ni de lejos :P

  2. Cierto Gracias.

  3. Esto no lo entiendo, si he declarado i como un int i = 0; y el bucle se encarga de incrementarla a traves del i++; ... Es decir le estoy diciendo que compruebe:

mivar.charAt(i) == 'W'

mivar.charAt(0) == 'W'
mivar.charAt(1) == 'W'
mivar.charAt(2) == 'W'

¿o me equivoco?

Muchisimas gracias.

Y con respecto al uso de || && ¿que puedo hacer para agregar varias condiciones?

Yandr0s

Tal como esta escrito, en cada iteracion estas diciendole:

charAt(0) == [ 'P' || charAt(i)=='W' ] .

Es decir, estas diciendo, charAt(0) es igual a P o true/false (que es lo que devuelve la otra instruccion)

Por eso te dice el error que no se puede aplicar el operador && a un char y un bool

Lo que en un principio intentas hacer deberia escribirse:

if( (charAt(0)=='P') || (charAt(i)=='W') ) {

De esa forma, cada charAt se comprueba por separado, y luego se hace un OR entre dos booleanos

No se si se entiende xD

3 respuestas
FrUcTuS

#12 Edit2.

Si si que me funciona, aunque no se si estoy cometiendo algun fallo.

spoiler
if( (marca.charAt(0)=='P') || (marca.charAt(i)=='W') ){
	v = true;
}
Lutx1

#12 No se si estoy yo muy borracho o es que llevo medio año sin picar una linea , pero , en los operadores lógicos el OR es el ultimo mono , es decir, el ultimo que se ejecuta. Por lo tanto eso no podía ser.

No se como demonios lo has arreglado , pero, de primeras estas recorriendo "mivar" con la longitud de "marca", es decir, si mivar tiene 1 de longitud y marca 2 error, si mivar tiene 2 de longitud y marca 1 no consigues lo que quieres.

Creo que no he entendido bien algo porque sino no me lo explico.

Yo lo haría mas o menos así , no se si se adecua a lo que necesitas o si es correcto.

    [code]String marca="BMW";
    String mivar="El perro de san roque";
    boolean v=false;
    if (marca.charAt(0)=='P'){
        v=true;
    }else{                      
        int i=0;
        while(i<mivar.length()&&!v){
            if(mivar.charAt(i)=='W'){
                v=true;
            }
            i++;
        }           
    }
    
    if (v)
        System.out.println("hello");[/code]
1 respuesta
Ranthas

#9 Simplemente quiero convertir el bool en true si el primer carácter introducido es P o si encuentra la letra W a lo largo del texto. Pero solo puedo poner una condición en el IF ya que no puedo usar los operadores para añadir mas condiciones.

Entiendo que quieres devolver un true si en marca el primer carácter es una P o si marca contiene una W.

if (marca.charAt(0) == 'P' || marca.contains("W")) { return true; }

No es necesario iterar.

2 respuestas
B

#12 Euh, no. La precedencia de operadores no está definida así. La igualdad via == es más sticky que los lógicos. Además, lo que le has dicho tampoco es cierto. algo == ('P' || true) no comprueba si "algo" es igual a 'P' o true. En C básicamente sería algo == true porque evaluaría 'P' de forma implícita como true siempre (diferente de cero), en Java no se ni si compilaría porque tiene menos tolerancia a esas guarradas.

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

Para el ejercicio ese de todas formas, podrías hacerlo así:

boolean ok = marca.charAt(0) == 'P';
int i = 0;
while(i<marca.length() && !ok) {
  ok |= marca.charAt(i) == 'W';
  ++i;
}

Lo de dentro es equivalente a if(marca.charAt(i) == 'W') ok = true;

1 respuesta
AiTale

#15 Son ejercicios de Java en un curso. Lógicamente está aprendiendo a utilizar bucles, este chico no necesita la utilidad si no la práctica xD

FrUcTuS

#8 Sí me apunto esa que es mucho más fácil, parece que esas cosas no las enseñan...

#14 Sorry fue fallo mio al copiarlo a MV realmente la variable se llama marca y esta bien escrito.

#16 Es me viene bien pero lo cierto es que la de #15 funciona y compila. Gracias por la aclaración.

Usuarios habituales