Java - Datos por teclado (caracter)

Para introducir datos por teclado siempre he utilizado el paquete javabook2. Creo que hay otra opción de System.in pero nunca me he aclarado.

Con el javabook2, para introducir una cadena de caracteres se hace:
-----------------------------
String palabra;
palabra = SimpleInput.getString("Blablabla");
-----------------------------

Para un número entero:
int numero;
numero = SimpleInput.getInteger("Blablabla");

------------------------------

El problema es al querer introducir por teclado un caracter.

He probado con:
char c;
c = SimpleInput.getCharacter("Blablabla");

Me da el error:
symbol : method getCharacter(java.lang.String)
location: class javabook2.SimpleInput
caracter = SimpleInput.getCharacter("Introduce una letra");


Con SimpleInput.getChar me da lo mismo.... Alguna ayuda?
char caracter = (char) System.in.read()
Tienes que usar los flujos de entrada. Apoyate en System.In.


No tengo muy claro lo que quieres pero te pongo un ejemplo:

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



Con esto tienes un objeto entrada que puede leer caracteres del teclado si estás en modo consola. Puedes crear el objeto de tipo InputStreamReader simplemente pero BufferedReader ofrece algunas cosas útiles.


A continuación para leer una entrada harías:

String linea = entrada.readLine();


Así se queda esperando a que escribas algo y presiones enter. Luego deberás tratar la cadena como mejor te convenga

Hay más métodos de lectura que te pueden ayudar en esa clase
Muchas gracias por las respuestas.

He probado: char caracter = (char) System.in.read()
Me da un error al compilar:


unreported exception java.io.IOException; must be caught or declared to be thrown
System.in.read();



He buscado información y he encontrado esto: http://www.sc.ehu.es/sbweb/fisica/cursoJava/fundamentos/excepciones/excepciones.htm

Con este código sí compila, pero no ejecuta:


try {
System.in.read();
}catch (IOException ex) { }


Después dice:
Para solucionar el error que se produce en el programa durante su ejecución, se debe poner la llamada a Integer.parseInt en el siguiente bloque try...catch.
String str=" 12 "; int numero; try{ numero=Integer.parseInt(str); }catch(NumberFormatException ex){ System.out.println("No es un número"); }



Pero eso parece otro ejemplo @_@
K. Ichigo escribió:Muchas gracias por las respuestas.

He probado: char caracter = (char) System.in.read()
Me da un error al compilar:



He buscado información y he encontrado esto: http://www.sc.ehu.es/sbweb/fisica/cursoJava/fundamentos/excepciones/excepciones.htm

Con este código sí compila, pero no ejecuta:


try {
System.in.read();
}catch (IOException ex) { }


Uy que verde te veo...

A ver. Si lees el mensaje de error que te da el compilador:
unreported exception java.io.IOException; must be caught or declared to be thrown
System.in.read();

verás que se está quejando de que tienes que capturar o lanzar la excepción java.io.IOException que se puede dar por usar System.in.read()

Una excepción es una condición no esperada que podemos querer tratar, como dividir algo entre 0 o a la hora de intentar abrir un fichero que este no exista.

El método read de System.in puede producir una excepción de tipo java.io.IOException, que es el tipo de excepción relacionada con la entrada / salida (Input / Output).

Ergo. Lo que tienes que hacer, como te dice, es capturarla, usando un bloque try-catch o lanzarla, usando throws.

El bloque try catch funciona de la siguiente forma: el código que puede lanzar la excepción se coloca dentro del try. Ese código se intenta ejecutar, y si se da el caso de que se lance una excepción, se mira entre los catchs para ver si algún catch está intentado capturarla.

Para tu ejemplo lo que haríamos sería:

try {
   char caracter = (char) System.in.read();
   System.out.println("Introdujo " + caracter);
} catch(Exception e) {
   e.printStackTrace();
}


Como ves se intenta hacer el read y después imprimir lo que el usuario introdujo. Si se produce alguna excepción (la clase Exception es padre de IOException, luego si se da una IOException, como IOException es también un Exception entraría aquí) escribimos algún código para indicarle al usuario el error, por ejemplo un println como un mensaje de error o lo que hago yo, usar el método printStackTrace del objeto Exception para mostrar la traza.
Muchas gracias zootropo. Qué gran explicación[b] [/b][tadoramo] [plas]

Una duda que tengo y no me acabo de aclarar...

Supongo que no se pueden comparar Strings con caracteres no?

En un programa de prueba, con un String cadena "hola" y un char caracter 'h', he probado para ver si compilaba:

if(cadena.equals(caracter)){
System.out.println("OK");
}else{
System.out.println("KO");
}[


Sí compilaba. Y como es lógico, el resultado era 'KO', o sea que 'h' no es lo mismo que 'hola'.

He probado de comparar la primera letra de "hola" con h, y ahí supongo que debería dar Ok:

if(cadena.charAt(0).equals(caracter)){
System.out.println("OK");
}else{
System.out.println("KO");
}[


Y me sale el error al compilar:
char cannot be dereferenced

----------------------------
Entonces he probado lo siguiente:

char cadena2;
cadena2= cadena.charAt(0);
if(cadena2.equals(caracter)){
System.out.println("OK");
}else{
System.out.println("KO");
}


Y no compila. Sale el error: char cannot be dereferenced


Alguna ayuda?? [tomaaa] [tomaaa] [tomaaa]
Un char no tiene método equals ni cualquier otro porque no es un objeto. Se comparan con un simple ==

class Comparar {
   public static void main(String args[]) {
      String cadena = "hola";
      char caracter = 'h';

      if(cadena.charAt(0) == caracter)
         System.out.println("OK");
      else
         System.out.println("KO");
   }
}
zootropo escribió:Un char no tiene método equals ni cualquier otro porque no es un objeto. Se comparan con un simple ==


class Comparar {
   public static void main(String args[]) {
      String cadena = "hola";
      char caracter = 'h';

      if(cadena.charAt(0) == caracter)
         System.out.println("OK");
      else
         System.out.println("KO");
   }
}


Exception in thread "main" java.lang.ClassFormatError: comparar (unrecognized class file version)
at java.lang.VMClassLoader.defineClass(libgcj.so.70)
at java.lang.ClassLoader.defineClass(libgcj.so.70)
at java.security.SecureClassLoader.defineClass(libgcj.so.70)
at java.net.URLClassLoader.findClass(libgcj.so.70)
at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.70)
at java.lang.ClassLoader.loadClass(libgcj.so.70)
at java.lang.ClassLoader.loadClass(libgcj.so.70)
at gnu.java.lang.MainThread.run(libgcj.so.70)

[+risas] [+risas] [+risas]
Borra gcj y usa el jdk de Sun
zootropo escribió:Borra gcj y usa el jdk de Sun

No uso el gcj :S Uso el jdk de sun, compilando con javac y ejecutando con java. [boing]
K. Ichigo escribió:No uso el gcj :S Uso el jdk de sun, compilando con javac y ejecutando con java. [boing]

pues a mi me funciona...
por el error que te da, comprueba que tienes el classpath bien puesto y los packages tambien.
Estarás compilando con el comando javac, no te digo que no, pero lo más probable es que tengas mal puesto el path y estés ejecutando la versión libre que viene con tu sistema operativo en lugar de la versión de Sun
El path que estoy usando (en Linux) es:
/home/josue/Desktop/jdk1.6.0_01/bin

Creo que este es el que te refieres.
Llama a javac y java con la ruta completa a los ejecutables de Sun y te funcionará.
zootropo escribió:Llama a javac y java con la ruta completa a los ejecutables de Sun y te funcionará.

Tío... muchísimas gracias por todo!! Ya me va de lujo :D :D :D
15 respuestas