noviembre 06, 2011

Hay que programar para los tontos...

Algo que siempre tomo en cuenta a la hora de programar es que los programas que creemos deben de estar orientados a resolver la tarea que nos pidan, pero sobre todo que nuestro programa sea a prueba de tontos. Pensemos en que nosotros como personas diestras en el arte de programar entendemos muy bien el código de nuestro programa y su funcionamiento, pero NO PROGRAMAMOS PARA NOSOTROS MISMOS, nuestros programas están enfocados para el uso de cualquier persona (el usuario) y este no comprende el programa del mismo modo que el programador, por eso tenemos que siempre darle indicaciones de lo que debe hacer o de los datos que debe insertar para que nuestro programa resuelva su tarea. Como nosotros nos entendemos más hablando en código que con palabras, se los explicare así:

El siguiente es un programa muy sencillo, el cual pide un numero al usuario y el mismo numero lo muestra en pantalla:
//Archivo: Tontos.java

import javax.swing.JOptionPane;

public class Tontos{
 
   public static void main(String args[]){
  
      String valor=JOptionPane.showInputDialog("Dame un numero");
      int numero=0;
      numero=Integer.parseInt(valor);
    
      System.out.println("El numero que introdujo es: "+numero);
   }
}
Y listo, ¿es muy sencillo, no? el programa ya cumplió, y realiza a la perfección la tarea que se le encomendó. Ademas estamos siendo muy claros, le estamos diciendo al usuario que introduzca un NUMERO. Pero ¿que pasaría si es usuario introduce una letra o simplemente cancela la operación?, Nuestro programa se cae; se dice que nuestro programa se cae cuando no realiza la tarea a causa de un error lógico como este:


Como ya lo estudiamos anteriormente, si el usuario presiona el botón "Cancelar" el JOptionPane nos retorna un valor null y este valor no puede ser convertido a un entero, así que es ahí donde surge el error lógico y se cae el programa y nos muestra el mensaje anterior. Del mismo modo si el usuario introduce una letra en lugar de un numero, Integer.parseInt(); no podrá convertirlo a un valor entero y se caerá el programa. También se caerá el programa si el usuario no introduce nada y solo presiona aceptar puesto que nos retornara una cadena vacía que tampoco puede convertirse a un valor int. Cuando esto sucede nuestro programa no sirve.

Para esto JAVA implementa un par de instrucciones que nos ayudarán a combatir esos errores lógicos. Para el manejo de excepciones (o errores) tenemos el try{} catch{}, que funcionan como a continuación se explica retomando el programa anterior pero implementando estas instrucciones para mejorar nuestro programa, de tal modo que quedaría asi:

//Archivo: Tontos.java

import javax.swing.JOptionPane;

public class Tontos{
	
	public static void main(String args[]){
		
		String valor=JOptionPane.showInputDialog("Dame un numero entero:");
		int numero=0;
		try{
			numero=Integer.parseInt(valor);
		}
		catch(NumberFormatException error){
			System.out.println("Error al convertir el dato");
			System.out.println("--------------------------");
			System.out.println("VALOR POR DEFAULT:");
		}
		
		System.out.println("El numero es: "+numero);
	}
}
Note que dentro del cuerpo de try{} se encuentra la instrucción donde se podría generar el error lógico, entonces, dentro del try{} se ponen las instrucciones en donde usted crea que se va a generar el error lógico en caso de que el usuario introduzca datos incorrectos. Y la función del catch{} es cachar el error, si el try{} identifica que se genero un error se ejecutara el cuerpo del catch{}; en este caso el catch{} tiene como parámetro el tipo de error lógico que se generara NumberFormatException y un nombre para ese error al cual le pusimos error, después se ejecutan las instrucciones dentro del catch{} en donde mandamos un mensaje en pantalla que dice que ocurrió un error al momento de convertir el dato y que el valor por default es 0, ya que en la linea 10 inicializamos int numero con un valor de 0.

En caso de que el usuario siga bien las instrucciones del programa e introduzca los datos de forma correcta, nuestro programa al momento de pasar por el try{} entenderá que no hay ningún error lógico y por ende no se ejecutara el catch{}, simplemente se pasa a la impresión en pantalla del numero que el usuario introdujo (linea 20).

1 comentario: