Práctica 2 (TSIOCA 2007-2008)


Fecha
29-02-2008
Conceptos
Metodología de la programación y depuración de programas
Soluciones
pract2.zip
Profesores
Alberto Cortés y Pablo Basanta (mañana) y Jorge Ruiz, José María Rubio (tarde).

Metodología de la programación

Para poder empezar a programar, como para cualquier trabajo, es necesario disponer de las herramientas necesarias que nos faciliten su ejecución; de lo contrario, se puede convertir en una tarea muy caótica.

Sentarse directamente delante del ordenador y ponerse a teclear código puede convertirse en una pérdida de tiempo sin un poco de preparación previa. Debemos establecer nuestro entorno de trabajo: documentacion (API de Java+apuntes), programas de desarrollo (editor de textos y compilador), etc.

En primer lugar, deberíamos configurar la variable de entorno del sistema operativo CLASSPATH. Esta variable le indica al sistema en qué directorio se encuentran las clases que utilizaremos para el programa que vamos a realizar.


Ejercicio 1


Ejercicio 2

La herramientas más utilizadas para la depuración de errores son las aserciones y las trazas de depuración.

Una aserción es una condición que necesariamente se debe cumplir en un determinado segmento de código para que pueda considerarse que el código es correcto. Comprueba condiciones que en teoría nunca se darán. Puede especificarse como una comprobación del valor de una o varias variables de las que intervienen en el código:

if (x<0) {
  System.out.println("Error: valor negativo de x");
  System.exit(1);
}

Una aserción comprueba una condición que nunca debería cumplirse. En una aplicación final entregable no deberían ejecutarse nunca las aserciones, ya que se supone que el código está convenientemente probado para ello.

Las trazas de depuración son mensajes añadidos al código que nos informan del funcionamiento del mismo. De esta forma, en caso de algún error, la observación de dichos mensajes nos informará de en que parte del código se produjo el error. La forma más común (aunque menos potente) de añadir trazas de depuración es la impresión de líneas de texto utilizando la sentencia System.err.println("texto"). Un ejemplo de trazas de depuración:

public class ErrorDivisión {
        public static void main(String[] args) {
        boolean continuar=true;
        int a=3;
        int b=3;
        int c=4;
        int d=0;
        System.err.println("Empezando la depuración");
        a+=b;
        System.err.println("Vamos a ver si el programa divide bien");
        b+=c/d;
        System.err.println("El programa funciona bien");
        }
}

 


Ejercicio 3

Aunque las aserciones son una ayuda para la depuración de programas, la inmensa mayoría de las veces en que se produce un error en la aplicación final, no queremos que finalice su ejecución. Imagina una aplicación de un tamaño considerable, como servidor de aplicaciones corporativo, en la que cada vez que se produjera un error el sistema únicamente sacara un mensaje dando información y finalizara su ejecución y la de todos los procesos asociados. Las aplicaciones deben ser resistentes a todas las condiciones de error que se le puedan plantear y que se puedan controlar.

En Java, el control de los errores que se pueden producir durante su ejecución se realiza con el manejo de excepciones.  En Java, todas las excepciones se construyen a través de la interfaz Throwable, y a grosso modo se pueden cabría clasificarlas en dos grandes categorías: Errores y ExcepcionesLos errores denotan grandes problemas de ejecución que deberían desencadenar en una parada de la maquina virtual mientras que una excepción tiene, en principio un grado de criticidad mucho menor. A su vez las Excepciones se dividen en dos grandes grupos, aquellas que aparecen ligadas a problemas que aparecen de forma más común en la ejecución de un código (ArithmeticException, IndexOutofBoundsException, ...) y aquellas que aparecen  ligadas a situaciones menos generales (como por ejemplo la SQLException, relacionada con el acceso a elementos de una bases de datos). Recuerde que siempre puede utilizar el API de Java para obtener una descripción de cada una de estas clases. 

Aunque en el manejo de las excepciones se pueden crear (definiendo nuevas clases que hereden de Exception), lanzar (mediante la cláusula throw), quizás desde su punto de vista practico lo más interesante sea su captura y procesamiento. Esto se hace mediante bloques try-catch.

try {
  // Codigo que puede generar excepciones
} catch(Exception0 id0) {
  // Manejo de excepciones del tipo Exception0
} catch(Exception1 id1) {
  // Manejo de excepciones del tipo Exception1
} catch(Exception2 id2) {
  // Manejo de excepciones del tipo Exception2
}

Dentro del segmento try se situará la porción de código que puede producir una excepción, mientras que en cada uno de los segmentos catch controlaremos qué debe suceder en caso de que se hayan producido excepciones de la clase Exception0, Exception1, Exception2... etc


Ejercicio 4

La excepción "java.lang.ArithmeticException" se produce cuando existe algún tipo de condición excepcional en una operación aritmética (por ejemplo, cuando dividimos por 0 un valor entero). Existen otras excepciones con las que nos encontraremos continuamente mientras depuramos nuestros programas.


Ejercicio 5

Una empresa te ha contratado para realizar una implementación del "Ahorcado". Antes de comenzar a realizar la implementación, habláis con el cliente, el cual os da la siguiente información:

"El juego de El ahorcado que queremos debe interactuar con el usuario únicamente por medio del teclado y la pantalla del ordenador en modo texto. Antes de comenzar el juego, se escogerá una palabra secreta obtenida de un fichero de texto cuya longitud en caracteres debe ser superior a 1, y se le indicarán al usuario el número de letras de que se compone dicha palabra. El usuario entonces podrá realizar preguntas sobre posibles subcadenas de la palabra secreta, cada una de las cuales le penalizará en una oportunidad de las 6 disponibles. En caso de que la consulta este contenida dentro de la palabra secreta, la aplicación debe mostrar la posición en que se encuentra. El máximo tamaño de una consulta que puede realizar el usuario debe ser igual a la longitud de la palabra secreta, con lo que debe indicársele al usuario cuando ha incumplido esta condición. Igualmente tampoco podrá realizar una consulta de una palabra vacía (""). En caso de que el juego termine, debe indicarle el resultado al usuario y, tras solicitarle si desea volver a jugar, realizar otro juego en caso afirmativo. También mencionar que el número de oportunidades posibles es de 6 intentos."