lunes, 11 de abril de 2011

[TALLER] Manejo de eventos, excepciones y errores

En esta entrada mostrare las excepciones en mi proyecto y una breve descripción del porqué se utilizan.

Exception:

public Database(){
  try{
   Class.forName(drv);
   ct =DriverManager.getConnection(db, user, pword);
   st =ct.createStatement();
   System.out.println("Conección exitosa.");
  }catch(Exception e){
   System.out.println("No se pudo conectar a la base de datos.");
  }
 }

En el código anterior se muestra un constructor utilizado para hacer conexión con la base de datos. Todo el código va dentro de un "try" y después un "catch" con una excepción y un mensaje al usuario.

La excepción es del tipo Exception ya que se utiliza la clase Class que solo puede aceptar un tipo de excepción general.

SQLException:

public void showAll(String matt, String pass) {
  String dia = new String();
  Scanner a = new Scanner(System.in);
  System.out.println("Introduzca un dia (Lu, Ma, Mi, Ju, Vi, Sa): ");
  dia = a.next();
  dayselection = dia;
  try{
   do{
    stmt = ct.prepareStatement("SELECT * FROM Alumnos, "+dia+" WHERE  Alumnos.idAlumnos = ? AND Alumnos.idPass = ? AND Alumnos.idAlumnos = "+dia+".idAlumnos");
    stmt.setString(1,matt);
    stmt.setString(2, pass);
    rs = stmt.executeQuery();
    if(rs.next()){
     System.out.println("Seleccione Horario: ");
     String sub = a.next();
     System.out.println(rs.getString(sub));
     subselection=rs.getString(sub);
     fill_data();
     rs.close();
    }
    else{
     System.out.print("Error");
     rs.close();
    }
   }while(rs.isClosed()==false);
  }catch(SQLException e){
   System.out.println("No se pudo realizar la consulta.");
  }
 }

En el código anterior se muestra un método para obtener información de una base de datos a partir de un usuario y una contraseña. Todas las consultas de SQL deben de ir en un try y acompañadas de un catch. En este caso es una excepción del tipo SQLException, que provee información sobre algún error de conexión a la base de datos, en este caso manda al usuario un mensaje de error diciendo que no se pudo conectar a la base de datos.

public void fill_data(){
  try{
   stmt = ct.prepareStatement("SELECT * FROM "+subselection+", "+dayselection+" WHERE "+dayselection+".idAlumnos = "+subselection+".idAlumnos");
   rs = stmt.executeQuery();
   while(rs.next()){
    for(int i=2; i<=9; i++){
     phrs(i);
     if(rs.getString(i) == null){
      System.out.println("Sin Datos");
     }
     else{
      System.out.println(rs.getString(i));
     }
    }

   }
  }catch(SQLException i){
   System.out.println("No tiene materia asignada en ese horario.");
  }
 }

En este caso sucede lo mismo ya que se desea realizar una consulta, este método se encarga de mostrar materias habiendo introducido un horario, de haber un error en la consulta, significa que no existe una materia en el horario seleccionado, de haber cualquier otro tipo de error, el programa jamas habría llegado a este punto.

IOException:
public static void main(String[] args) throws IOException{
  
  boolean selec=true;
  Horario h = new Horario();
  
  Console terminal = System.console();
        if (terminal==null ) {
            System.err.println("No puedo obtener la consola.");
            return;
        }
  String mat = new String (terminal.readLine("Ingresar Usuario: "));
  String pass= new String (terminal.readPassword("Ingresar contraseña: "));
  while(selec == true|| selec ==true){
   h.showAll(mat, pass);
   System.out.print("¿Desea ver otra materia?(S/N): ");
   char sel= (char) System.in.read();
   
    switch(sel) {
    case 's': 
     selec = true;
        break;
        
    case 'S':
     selec=true;
     break;
    
    default:
     selec = false;
        break;
   }
   
   
  }
 }

Existe otra forma de expresar un error, lanzando directamete una excepción sin un try y catch. Este es el método main, y la palabra seguida "throws" que significa lanza, que literalmente lanza una excepción de tipo IOException, es utilizada para mostrar información de errores de entrada y salida.

En este caso, la clase Console siempre debe de ser acompañada de este tipo de excepciones, ya que si se ejecuta el programa desde un lugar distinto de la consola, este lanzara un mensaje de error.

Eventos, excepciones y errores

En esta entrada explicare que son los eventos, errores y excepciones.

Eventos:

Los eventos son todas las acciones que el usuario inicia, dar clic sobre un botón, presionar las teclas del teclado, etc. Cada vez que se produce un evento, se crea un objeto. La clase padre de los eventos es "java.awt.event".

Cada lenguaje de programación tiene su propio modelo de eventos, en Java se definen clases auxiliares llamadas escuchadores (listeners) que reciben eventos específicos.

Los escuchadores se registran en las fuentes de eventos (teclado, ratón, etc). Estas envían objetos del tipo EventObjet la los escuchadores registrados al producirse un evento. Cada escuchador utiliza la información recibida a través del objeto para realizar las acciones adecuadas.

Dentro de "java.awt.event", los eventos están categorizados dentro de una jerarquía de clases.
  • La clase "java.util.EventObject" es la clase base de todos los
    eventos en Java.
  • La subclase "java.awt.AWTEvent" es la clase base de todos los
    eventos que se utilizan en la construcción de GUIs.
  • Cada tipo de evento "xxEvent" tiene asociada una interfaz "xxListener" que es la que nos permite definir escuchadores de eventos.
  • Para simplificar la implementación de algunos escuchadores de eventos, el paquete "java.awt.event" incluye clases base xxAdapter que implementan las interfaces xxListener.
Existen distintos tipos de eventos, los cuales son:

Eventos de Ventana

Son los que se generan en respuesta a los cambios de una ventana, un frame o un dialogo.
  •     WINDOW_DESTROY
  •     WINDOW_EXPOSE
  •     WINDOW_ICONIFY
  •     WINDOW_DEICONIFY
  •     WINDOW_MOVED
Eventos de Teclado

Son generados en respuesta a cuando el usuario pulsa y suelta una tecla mientras un Componente tiene el foco de entrada.
  •     KEY_PRESS
  •     KEY_RELEASE
  •     KEY_ACTION
  •     KEY_ACTION_RELEASE
Eventos de Ratón

Son los eventos generados por acciones sobre el ratón dentro de los límites de un Componente.
  •     MOUSE_DOWN
  •     MOUSE_UP
  •     MOUSE_MOVE
  •     MOUSE_ENTER
  •     MOUSE_EXIT
  •     MOUSE_DRAG
Eventos de Barras

Son los eventos generados como respuesta a la manipulación de barras de desplazamiento (scrollbars).
  •     SCROLL_LINE_UP
  •     SCROLL_LINE_DOWN
  •     SCROLL_PAGE_UP
  •     SCROLL_PAGE_DOWN
  •     SCROLL_ABSOLUTE
Eventos de Lista

Son los eventos generados al seleccionar elementos de una lista.
  •     LIST_SELECT
  •     LIST_DESELECT
Eventos Varios

Son los eventos generados en función de diversas acciones.
  •     ACTION_EVENT
  •     LOAD_FILE
  •     SAVE_FILE
  •     GOT_FOCUS
  •     LOST_FOCUS
Errores:

Los errores en la programación suelen ser comunes, ya que es casi imposible programar sin que exista un solo error, inclusive en productos finales existen errores de software, que casi siempre tratan de corregir con parches de seguridad y actualizaciones.

En algún momento por alguna causa, podría generarse algún conflicto en el programa. Ya sea porque no hay conexión a Internet, usuario o contraseña incorrecta, valores alfanuméricos en campos solo para números, y en algunos casos el código del programa no esta escrito correctamente, sin embargo, este ultimo se analizara en el siguiente tema (Diseño de pruebas unitarias).

Existen formas para detectar y corregir errores en un programa por medio de opciones alternativas llamadas excepciones.


Excepciones:

Las excepciones en Java están destinadas, al igual que en el resto de los lenguajes que las soportan, para la detección y corrección de errores.

Si hay un error, la aplicación no debería morirse y generar un core . Se debería lanzar (throw) una excepción que nosotros deberíamos capturar (catch) y resolver la situación de error.

Existen muchos tipos de excepciones,casi una por cada tipo de error, por lo que si tenemos error de entrada/salida de datos, el programa deberia de lanzar una excepción de tipo IOException.

En Java, cada excepción es una clase hija de "java.lang.Exception", por lo que podemos crear nuestras propias excepciones en lugar de utilizar las ya predefinidas.


En este gráfico podemos ver algunos de los errores y excepciones dentro de la clase Throwable que extiende de Object y tiene como hijas a Error y Exception.