Foros aprenderaprogramar.com
Aprender a programar => Aprender a programar desde cero => Mensaje iniciado por: MrClassic en 25 de Febrero 2015, 09:29
-
Cordial Saludo,
Entrega nº57 del curso "Aprender programación Java desde cero".
Como podria hacer en este caso para introducir una excepcion que me impida ingresar cadenas vacias?( " ") intente con el metodo x.equals(""), pero me arroja un error que creo que hace referencia a salir de el liminte de tamaño permitido.
de igual manera dejo comentado lo que intente hacer.
pero en conclusion creo que esta funcional la entrega.
Clases implementadas:
PideEntrada
CapturaDatos
Codigo:
PideEntrada
import java.util.Scanner;
public class PideEntrada{
public static void main(String []args){
//Properties
CapturaDatos entrada;
String entradaResultado, entradaDatos;
//Constructor
entrada = new CapturaDatos();
System.out.println("\nINGRESE DATOS: ");
entradaDatos = entrada.capturaStr();
/* if (entradaDatos.equals(" ")){
String info ="No ha ingresado datos validos";
System.out.println(info);
}
else{*/
if(entradaDatos.length() < 5) {
if (entradaDatos.substring(0,1).equals("A")){
System.out.println("La cadena introducida tiene menos de 5 caracteres y comienza por A");
}else{
System.out.println("La cadena introducida tiene menos de 5 caracteres y no comienza por A");
}
}
else if (entradaDatos.length() >=5 && entradaDatos.length() <= 15){
if (entradaDatos.substring(0,1).equals("A")){
System.out.println("La cadena introducida tiene entre 5 y 15 caracteres y comienza por A");
}else{
System.out.println("La cadena introducida tiene entre 5 y 15 caracteres y no comienza por A");
}
}else if(entradaDatos.length() > 15){
if (entradaDatos.substring(0,1).equals("A")){
System.out.println("La cadena introducida es mayor a 15 caracteres y comienza por A");
}else{
System.out.println("La cadena introducida es mayor a 15 caracteres y no comienza por A");
}
}
// }
//Imprimimos
System.out.println(entradaDatos);
}
}
CapturaDatos
import java.util.Scanner;
public class CapturaDatos{
String datoStr;
int datoInt;
double datoDbl;
Scanner datoIngresado =null;
public String capturaStr(){
datoIngresado=new Scanner(System.in);
datoStr = datoIngresado.nextLine();
return datoStr.toUpperCase();
}
/*
* public String capturaStr(){
datoIngresado=new Scanner(System.in);
datoStr = datoIngresado.nextLine();
if (datoStr != " "){
return datoStr.toUpperCase();
}else{
String info ="No ha ingresado datos validos";
System.out.println(info);
return info;
}
}
*/
}
-
Hola MrClassic
La clase cumple el cometido respecto a la longitud de la cadena y al valor de la primera letra.
Para usos posteriores te apunto un método de la clase String:
equalsIgnoreCase(cadenaTexto)
que no distingue entre mayúsculas y minúsculas.
Respecto a controlar las cadenas vacías. Te adjunto una clase con método estático.
Nota: Para usar un método estático, no se crea una instancia de la clase. Se usa directamente así:
Clase.metodo();
Como el método pow() de la clase Math
clase Teclado
import java.util.Scanner;
public class Teclado {
/**
* Espera una entrada de teclado excluyendo entradas vacias
*/
public static String lee() {
String texto = "";
do {
texto = escucha();
// if (texto.length() == 0) {
// System.out.print("No ha ingresado datos validos.");
// }
} while(texto.length() == 0);
return texto;
}
private static String escucha() {
Scanner entrada = new Scanner(System.in);
return entrada.nextLine();
}
} // Fin de la clase Teclado
En tu main tendrás que hacer modificaciones y en algún lugar habrás de poner:
entradaDatos = Teclado.lee();
Saludos
-
Cordial saludo,
Excelente, todo funciono de maravilla,
pude notar que intente hacer la condicion usando el String vacio, es decir if(x =" "); pero según tu indicación el enfoque se basa en la posición mas que en el contenido,if( x.length == 0);
lo que me resulta logico pero ingenioso, lo que me recuerda a lo comentado por mi anteriormente sobre encontrar soluciones sencillas para problemas.
en el main() solo tube que cambiar el metodo que retorna la cadena, y con el cambio de equals(); por equalsIgnoreCase(); todo funciono de perlas.
otra cosa que note es que en el metodo static se tienen que declarar las variables dentro del metodo y no de manera global en cabezera, al igual que cambiar el metodo capturaStr de private a public para que pueda ser leido por el main();
muchas gracias muy ilustrativas tus indicaciones.
adjunto codigo corregido.
datosCapturados();
import java.util.Scanner;
public class CapturaDatos{
//Scanner datoIngresado =null;
//Metodo para capturar una entrada de teclado excluyendo entradas vacias
public static String lee(){
String texto = capturaStr();
do{
texto = capturaStr();
if(texto.length()==0){
System.out.println("No ha ingresado datos validos.");
}
}while(texto.length()==0);
return texto;
}
//Metodo que captura un String
public static String capturaStr(){
Scanner datoIngresado=new Scanner(System.in);
return datoIngresado.nextLine();
//return datoStr;//.toUpperCase();
}
}
PideEntrada
import java.util.Scanner;
public class PideEntrada{
public static void main(String []args){
//Properties
CapturaDatos entrada;
String entradaResultado, entradaDatos;
//Constructor
entrada = new CapturaDatos();
System.out.println("\nINGRESE DATOS: ");
entradaDatos = entrada.lee();
if(entradaDatos.length() < 5) {
if (entradaDatos.substring(0,1).equalsIgnoreCase("A")){
System.out.println("La cadena introducida tiene menos de 5 caracteres y comienza por A");
}else{
System.out.println("La cadena introducida tiene menos de 5 caracteres y no comienza por A");
}
}
else if (entradaDatos.length() >=5 && entradaDatos.length() <= 15){
if (entradaDatos.substring(0,1).equalsIgnoreCase("A")){
System.out.println("La cadena introducida tiene entre 5 y 15 caracteres y comienza por A");
}else{
System.out.println("La cadena introducida tiene entre 5 y 15 caracteres y no comienza por A");
}
}else if(entradaDatos.length() > 15){
if (entradaDatos.substring(0,1).equalsIgnoreCase("A")){
System.out.println("La cadena introducida es mayor a 15 caracteres y comienza por A");
}else{
System.out.println("La cadena introducida es mayor a 15 caracteres y no comienza por A");
}
}
// }
//Imprimimos
System.out.println(entradaDatos);
}
}
-
Hola MrClassic
otra cosa que note es que en el metodo static se tienen que declarar las variables dentro del metodo y no de manera global en cabezera, al igual que cambiar el metodo capturaStr de private a public para que pueda ser leido por el main();
Todo método puede declarar las variables que va a utilizar. También se pueden declarar en el encabezado de la clase (como campos o atributos de la clase). Pero si los va a utilizar un método estático, deben declararse estáticos también esos campos/atributos.
Es nuestra elección si deben ser variables internas y exclusivas del método, o deben ser visibles a toda la clase.
Tu clase funcionará igual si el método capturaStr es private. Otra cosa, es que tu quieras que sea visible porque lo vas a llamar desde otra clase. Como private solo lo pueden usar los métodos de la propia clase CapturaDatos.
-----
Tu ejercicio incorpora la gestión de entradas vacías, Bien.
Pero hay dos cosas a mejorar:
1º
Cuando ejecutas el método lee() de la clase CapturaDatos, tienes estas dos instrucciones:
a) String texto = capturaStr();
b) texto = capturaStr();
La primera captura de texto -a)- la descartas (no la gestionas) y la segunda, la -b)- sí la gestionas.
No sé que propósito tiene pedir una entrada que no se gestiona. Tu petición de texto a ingresar, ahora funciona así:
Primero un ENTER con o sin texto previo, luego el texto a gestionar y al final un ENTER
Si quieres que tus entradas de texto tengan esta estructura, deberías anunciarlo para no dar lugar a equívocos.
A mi parecer la instrucción a) estaría bien inicializarla de otra manera como:
a) String texto = "";
a) String texto = " ";
a) String texto = "Texto temporal";
Es igual el texto que pongas, pues será reemplazado por la instrucción b), que pide una entrada de texto por teclado para gestionarla después.
2º
En el método main tienes una variable:
entradaResultado
que no utilizas para nada, se habrá quedado de otra línea de código.
Y las siguientes instrucciones:
CapturaDatos entrada;
entrada = new CapturaDatos();
entradaDatos = entrada.lee();
pueden sustituirse las tres, por la siguiente:
entradaDatos = CapturaDatos.lee();
Esto --CapturaDatos.lee();-- se puede hacer porque el método lee() es estático.
Si comprendes lo expuesto, no hace falta que envíes de nuevo el ejercicio, excepto que me haya dejado algo sin responder.
Saludos