Evaluar Variable cuando esta vacia

Iniciado por ^Tifa^, 3 Diciembre 2008, 23:19 PM

0 Miembros y 2 Visitantes están viendo este tema.

^Tifa^

Hola, estoy recien aprendiendo Java.  :rolleyes:

Bueno tengo una variable tipo caracteres, y quiero que cuando el usuario deje esto vacio, pues salga algun warning o algo asi, pero el codigo me esta obviando eso, y me esta imprimiendo el otro valor  :-\  todavia estoy un poco liada en cuanto al manejo de excepciones en Java ... cualquier tipo de explicacion se apreciaria  :rolleyes:

Código (java) [Seleccionar]

import java.util.*;
import java.io.*;

public class Sol {

public static String palabra;

public static void main(String[] args) throws IOException {

BufferedReader a = new BufferedReader(new InputStreamReader(System.in));

int numeral = 15;

Verdura.naranja(numeral);

System.out.println("Inserta palabra");
palabra = a.readLine();

if ( palabra == "" ) {
System.out.println("Debiste poner algo");
} else {
Verdura.naranja(palabra);
}
}
}

class Verdura {

private static int numero = 10;
private static int numero1 = 20;

public static int naranja(int numeral) {

System.out.println("Respuesta es " + numeral+(numero*numero1));

return 0;
}

public static void naranja(String catarata) {

try {

PrintWriter b = new PrintWriter(new FileWriter("archivo.txt"));

b.println(numero);
b.println(numero1);

b.close();
} catch (IOException e) {

System.out.println("No se puede crear el archivo");

}
}
}

-Ramc-

Los String son objetos por lo que si haces == estarias comprobando si los 2 objetos apuntan al mismo lugar, para comparar cadenas usa los métodos equals(String) y equalsIgnoreCase(String) de la misma clase String, con equals comparas y con equalsIgnoreCase, comparas sin importar las mayúsculas ni minúsculas.

seria algo como:

palabra.equals("");

PD: Para leer desde consola te recomiendo el uso de la clase Scanner que se encuentra en java.util :

Con:

Scanner sc = new Scanner(System.in);
String p = sc.next();


Mucho mas corto ;)

Shhh... be vewy, vewy, quiet!  I'm hunting wabbits...
LA PANDILLA MAS GRANDE DE MI CIUDAD, SE LLAMA POLICIA NACIONAL.

arlick

#2
Puedes probar con esto

Código (java) [Seleccionar]

if ( palabra.length() == 0) {
System.out.println("Debiste poner algo");
} else {
Verdura.naranja(palabra);
}


Como han comentado arriba en java los strings deben compararse con equals. Los caracteres especiales llevan la barra invertida delante.

\n salto de linea
\t tabulado

así unos cuantos, esos son los más útiles que recuerdo xD

Por otra parte nunca va a ejecutar esto:

Código (java) [Seleccionar]

public static int naranja(int numeral) {                                                                                                                     
                                                                                                                                                             
        System.out.println("Respuesta es " + numeral+(numero*numero1));

return 0;
}


¿Por qué? Porque no has hecho una conversión a número antes. Cuando llamas a naranja(palabra) siempre va a llamar al otro método porque palabra es un objeto de tipo string, tenga el valor que tenga.

Para sacar el valor entero de un string puedes usar esto:

Código (java) [Seleccionar]

int num = Integer.parseInt(palabra);


En caso de que palabra no sea un número entonces lanza una excepción, esto puede ser útil. Yo cambiaría tu código así:

Código (java) [Seleccionar]

import java.util.*;                                                                                                                                         
import java.io.*;                                                                                                                                           
                                                                                                                                                             
public class Sol {                                                                                                                                           
                                                                                                                                                             
        public static String palabra;                                                                                                                       
                                                                                                                                                             
        public static void main(String[] args) throws IOException {                                                                                         
                                                                                                                                                             
                BufferedReader a = new BufferedReader(new InputStreamReader(System.in));                                                                     
                                                                                                                                                             
                int numeral = 15;                                                                                                                           
                                                                                                                                                             
                Verdura.naranja(numeral);                                                                                                                   
                                                                                                                                                             
                System.out.println("Inserta palabra");                                                                                                       
                palabra = a.readLine();                                                                                                                     
                int num = 0;                                                                                                                                 
                                                                                                                                                             
                if ( palabra.length() == 0 ) {                                                                                                               
                        System.out.println("Debiste poner algo");                                                                                           
                } else {                                                                                                                                     
                       try{                                                                                                                                 
                               num = Integer.parseInt(palabra);                                                                                             
                               Verdura.naranja(num);                                                                                                         
                       }catch (Exception nfex){                                                                                                             
                               //si salta excepcion es porque no era un numero y se ejecuta el otro metodo                                                   
                               Verdura.naranja(palabra);                                                                                                     
                       }                                                                                                                                     
                }                                                                                                                                           
        }                                                                                                                                                   
}                                                                                                                                                           
                                                                                                                                                             
class Verdura {                                                                                                                                             
                                                                                                                                                             
        private static int numero = 10;                                                                                                                     
        private static int numero1 = 20;                                                                                                                     

        public static int naranja(int numeral) {
                System.out.println("Respuesta es " + numeral+(numero*numero1));
                return 0;
        }

        public static void naranja(String catarata) {

                try {

                        PrintWriter b = new PrintWriter(new FileWriter("archivo.txt"));

                        b.println(numero);
                        b.println(numero1);
                        b.close();
                        System.out.println("Se has escrito correctamente");
                } catch (IOException e) {
                        System.out.println("No se puede crear el archivo");
                }
        }
}

^Tifa^

Bueno, gracias   ;D

Es un poco complicado entender el manejo de Excepciones en Java para mi  :-\  (Aunque las excepciones en PL/SQL las entiendo perfectamente y se cuando debo y cuando no aplicarlas   ;)  ) yo que vengo de lenguajes puramente estructurados como C pero ahi estoy intentando.

Yo pensaba que podia evaluar el vacio de una variable tipo String con " "  pero veo que no. Igual me tomare este ejemplo enserio para poder continuar con mi aprendizaje... se que el codigo esta sumamente principiante pero soy autodidacta y apenas llevo menos de 1 semana tratando de relacionarme con Java y comprenderlo...

Igual, mil gracias   :-*    :-*    :-*

arlick

#4
Cita de: ^TiFa^ en  4 Diciembre 2008, 13:48 PM
Bueno, gracias   ;D

Es un poco complicado entender el manejo de Excepciones en Java para mi  :-\  (Aunque las excepciones en PL/SQL las entiendo perfectamente y se cuando debo y cuando no aplicarlas   ;)  ) yo que vengo de lenguajes puramente estructurados como C pero ahi estoy intentando.

Yo pensaba que podia evaluar el vacio de una variable tipo String con " "  pero veo que no. Igual me tomare este ejemplo enserio para poder continuar con mi aprendizaje... se que el codigo esta sumamente principiante pero soy autodidacta y apenas llevo menos de 1 semana tratando de relacionarme con Java y comprenderlo...

Igual, mil gracias   :-*    :-*    :-*

De nada :D

Lo primero que debes hacer es aprender que es todo lo relacionado con programación orientada a objetos. No es muy difícil, pero hay que tomárselo con calma.

Breve expliación de las excepciones:

¿Qué es una excepción? Es un objeto que normalmente (no siempre) se lanza automáticamente cuando hay un error y que puede ser encapsulado para controlarlo.

El bloque de control para tratar una excepción es este:

Código (java) [Seleccionar]

try{
       //sentencias java
}catch (Exception e){
       //sentencias java
}



Ese es el más típico. Captura una excepción de tipo "Exception" PERO! Todas descienden de ese tipo (repito importante aprender las bases de orientación a objetos), así que ahí estarían capturadas todas.

Además como ves en el catch se pueden poner las mismas sentencias que fuera, incluso otro try si quieres!!

Tal vez sea necesario diferenciar entre un error de números por ejemplo del resto de errores:

Código (java) [Seleccionar]

try{
     //sentencias
}catch(NumberFormatException nfex){
    System.out.println(nfex.toString());
    //sentencias
}catch (Exception e){
    //sentencias
}


Como puedes ver se puede clasificar el tipo de error que suelta y actuar según el caso. Se podría decir que es parecido aún switch (salvando las diferencias!).

¿Qué es nfex y la e? Es el nombre que se da al objeto creado. Al saltar la exceción se crea un objeto del tipo que fuese y ahí que darle un nombre. Así si salta uno del tipo NumberFormatException ese objeto se llamará nfex y podré usarlo como ves arriba. Con la "e" lo mismo, es el nombre para el resto de errores posible.

Además esa estructura tiene otro posible uso:

Código (java) [Seleccionar]

try{
     //code
}catch(Exception e){
     //code
}finally{
    //code
}


Puedes ver que he añadido "finally". Ese bloque se ejecutará SIEMPRE, tanto si se lanzó la excepción como si no, es importante recordarlo. ¿Para qué es útil? Por ejemplo para cuando se está tratando ficheros y surge una excepción que va a hacer abortar el fichero. Bien pues ahí dentro puedes cerrar el fichero o lo que creas que sea necesario.

Recuerda que si pones el bloque finally (solo se puede poner un bloque finally) siempre se ejecutará, tanto si salta excepción como si no.

PD: algo totalmente imprescindible es acostumbrarse a usar la API de java, la documentación. Acá la tienes para la versión 1.6, no se cual tendrás instalada:

http://java.sun.com/javase/6/docs/api/

Nota rápida: Todo lo que funciona por defecto en java está includio en el paquete java.lang, tal vez sea útil echarle un vistazo y ver que hay dentro. Por ejemplo está la clase String, si no estuviese tendrías que estar importandolo siempre.

^Tifa^

Ok...

Código (java) [Seleccionar]

catch(NumberFormatException nfex){    System.out.println(nfex.toString());    //sentencias}catch (Exception e)



En relacion a nfex y e, son nuevos tipos de objetos definidos por ti o estos ya existen?? O sea es totalmente legal que yo haga algo tipo :


Código (java) [Seleccionar]

catch(Exception manzana){    //sentencia }


O explicitamente existen objetos ya definidos para cada metodo... ?

Continuo haciendo referencia a las Excepciones porque es mi punto debil por el momento con Java.

-Ramc-

nfex y manzana simplemente son los nombres que les das a las variables de tipo NumberFormatException o Exception, que son otras clases mas.

Todas las excepciones, que puedas capturar y lanzar, se derivan de la clase Exception, por lo que capturar una excepción de tipo exception es com si capturaras cualquiera. Pero, mejor no te enredo mas xD.

Mira, los métodos pueden lanzar errores por diferentes razones, por ejemplo en el paquete io, que es el de entrada y salida estándar pueden haber errores, de que el archivo no existia y se intento leer, o que el archivo no tenia permisos de escritura, que la ruta estaba mal formada, etc, etc.

Un programa nunca es perfecto y esta propenso a errores, algunos son manejables como los que te mensione antes, estos errores que son manejables, java me dice que debo capturarlos y lanzarlos. Cuando tu pusiste en tu método main throws IOException.

Dijiste, mi método posiblemente lanze una IOException, cualquiera que desee usarlo, debe capturar estas excepciones. Es decir que cualquiera que llame tu método, debera llamarlo dentro de un try { } catch() { }, en el bloque try va la parte del código que puede lanzar una excepción, try lo protege, para que cuando se produzca la excepción haga algo con ella, el catch recibe las excepciones que puede producir el bloque try, por eso vemos catch(IOException e), etc, y en el bloque del catch, va lo que se debe hacer cuando ocurre esa excepción, la mayoria de programadores simplemente imprimen el error, con e.printStackTrace(); pero, si se puede hacer algo mas inteligente con el error, se debe hacer, cuando utilize e.printStackTrace();  utilize e, porque anteriormente hice esto catch(IOException e) le dije que la excepción la identificaria con el nombre e. Si no sabes que tipo de excepción pueda lanzar algún método, pero, sabes que lanza, puedes capturar Exception que es la excepción mas general de las manejables.

Ahí otro tipo de excepciones no manejables y es un tema un poco extenso, pero, creo que con lo básico ya tenes y practicando te saldra.

Cualquier duda, un MP o mejor aun, aquí en el foro.

Shhh... be vewy, vewy, quiet!  I'm hunting wabbits...
LA PANDILLA MAS GRANDE DE MI CIUDAD, SE LLAMA POLICIA NACIONAL.

Nakp

#7
podrías ir mas cutre con: :xD (String texto)

Código (java) [Seleccionar]
if(texto.lenght()==0)

o todavía peor... con

Código (java) [Seleccionar]
if(texto == "")

pero la clase String tiene un método .isEmpty (booleano) y es el correcto hun, pero no el único

Código (java) [Seleccionar]
if(texto.isEmpty()){
    //TODO
}else{
    //TODO
}


para leer datos prefiero Scanner

Código (java) [Seleccionar]
import java.util.Scanner;

//en el main o donde sea

Scanner scn = new Scanner(System.in);
texto = scn.nextLine(); //eso es todo ñ_ñ


salu2
Ojo por ojo, y el mundo acabará ciego.

^Tifa^

No podria aprenderme todas las funciones.....

Pero gracias por las sugerencias, apenas comienzo pero ya voy caminando  :-*