Nychol Bazurto Gómez
Asignación de responsabilidades
Manejo de las excepciones
Contrato de un método
Diseño de las signaturas de los métodos
Dichas suposiciones sólo quedan expresadas como parte de las instrucciones del método
No son necesariamente visibles por el programador que va a utilizarlo.
Si no tiene en cuenta estas suposiciones, puede obtener resultados inesperados
La solución a este problema es establecer claramente un contrato en cada método, en el que sean claros sus compromisos y sus suposiciones.
El dueño de la información es el responsable de esta
– El dueño debe permitir:
• el acceso a la información.
• modificar su valor
Se definen qué métodos hay por cada atributo:
– Descomponer los RF en pasos (subproblemas).
– Construir un método por cada paso.
– Descomponer los RF en pasos (subproblemas).
– Construir un método por cada paso.
Es la indicación de que se produjo un error en el programa.
Se produce cuando un método termina de manera excepcional debido a una situación anormal: ERROR.
Si no se maneja dicho error el programa termina su ejecución abruptamente y es probable que el usuario no entienda qué pasó.
public double dividir(int a, int b) { return a/b;
}
dividir(13,0);
Exception in thread "main" java.lang.ArithmeticException: / by zero at uniandes.cupi2.club.mundo.Membresia.main(Membresia.java:7)
public double dividir(int a, int b) { return a/b;
}
Integer denominador = null;
dividir(13,denominador);
Exception in thread "main" java.lang.NullPointerException at uniandes.cupi2.club.mundo.Membresia.main(Membresia.java:8)
Supongamos que estamos comprando en una página.
Vamos añadiendo artículos a nuestro "carrito" de compras.
Se dispara
Se atrapa
Se ejecuta una acción
Cuando se detecta una situación anormal, se debe disparar una excepción:
Cómo se trata una excepción: Disparar
El método que lanza la excepción debe advertir (anunciar) que puede producirse una.
public void descontarUnidades(int idProducto, int cantidad) throws Exception Cuando se detecta una situación anormal, se debe disparar una excepción:
Cómo se trata una excepción: Disparar
También quiere decir que este método está dejando pasar una excepción que generó una instrucción interna.
public void descontarUnidades(int idProducto, int cantidad) throws Exception Cómo se trata una excepción: Disparar
public void descontarUnidades(int idProducto, int cantidad) throws Exception
{
int cantidadDisponible = obtenerInventarioProducto( idProducto );
int unidadesRestantes = cantidadDisponible - cantidad;
if( unidadesRestantes < 0)
{
// Se actualiza las unidades del producto
actualizarUnidades( idProducto, unidadesRestantes );
}
else
{
throw new Exception("No hay suficientes unidades");
}
}Revisar que haya suficientes unidades en el inventario.
Cómo se trata una excepción: Disparar
public void descontarUnidades(int idProducto, int cantidad) throws Exception
{
int cantidadDisponible = obtenerInventarioProducto( idProducto );
int unidadesRestantes = cantidadDisponible - cantidad;
if( unidadesRestantes < 0)
{
// Se actualiza las unidades del producto
actualizarUnidades( idProducto, unidadesRestantes );
}
else
{
throw new Exception("No hay suficientes unidades");
}
}En caso de que hayan suficientes unidades, actualizar las unidades del producto.
Cómo se trata una excepción: Disparar
public void descontarUnidades(int idProducto, int cantidad) throws Exception
{
int cantidadDisponible = obtenerInventarioProducto( idProducto );
int unidadesRestantes = cantidadDisponible - cantidad;
if( unidadesRestantes < 0)
{
// Se actualiza las unidades del producto
actualizarUnidades( idProducto, unidadesRestantes );
}
else
{
throw new Exception("No hay suficientes unidades");
}
}En caso de que no hayan suficientes unidades, generar una excepción
Cómo se trata una excepción: Disparar
public void descontarUnidades(int idProducto, int cantidad) throws Exception
{
...
else
{
throw new Exception("No hay suficientes unidades");
}
}Se crea un objeto de la clase Exception
Se lanza la excepción con la instrucción throw
Cómo se trata una excepción: Disparar
public void descontarUnidades(int idProducto, int cantidad) throws Exception
{
...
else
{
throw new Exception("No hay suficientes unidades");
}
}public void descontarUnidades(int idProducto, int cantidad) throws Exception
{
...
else
{
Exception e = new Exception("No hay suficientes unidades");
throw e;
}
}Se debe atrapar una excepción antes de que el programa deje de funcionar. Para ello tenemos la instrucción try-catch.
Cómo se trata una excepción: Atrapar
try
{
instruccion1;
instruccion2;
instruccion3;
}
catch (Exception e)
{
instruccion4;
}Delimita la porción de código dentro de un método en el que necesitamos desviar el control si una excepción ocurre allí.
Se debe atrapar una excepción antes de que el programa deje de funcionar. Para ello tenemos la instrucción try-catch.
Cómo se trata una excepción: Atrapar
try
{
instruccion1;
instruccion2;
instruccion3;
}
catch (Exception e)
{
instruccion4;
}Definir el código que manejará el error o atrapará la excepción.
Se debe atrapar una excepción antes de que el programa deje de funcionar. Para ello tenemos la instrucción try-catch.
Cómo se trata una excepción: Atrapar
try
{
carrito.descontarUnidades(producto,cantidad);
carrito.actualizarPrecioTotal();
}
catch (Exception e)
{
JOptionPane.showMessageDialog( this,
"Problema actualizando carrito:", e.getMessage( ),
JOptionPane.ERROR_MESSAGE);
}Si todo funciona bien, no se ejecutan las instrucciones del bloque catch.
try
{
carrito.descontarUnidades(producto,cantidad);
carrito.actualizarPrecioTotal();
}
catch (Exception e)
{
JOptionPane.showMessageDialog( this,
"Problema actualizando carrito:", e.getMessage( ),
JOptionPane.ERROR_MESSAGE);
}Código que maneja el error. A través de la variable e podemos obtener información detallada del error
Cómo se trata una excepción: Ejecutar una acción
Cómo se trata una excepción: Ejecutar una acción
m4() throws Exception {
...
}
m3() throws Exception {
c.m4();
}
m2() throws Exception{
b.m3();
}
void m1(){
try{
a.m2();
}
catch(...){
}
...
}
Atrapa la excepción
y se recupera
Dejan pasar la excepción
Dispara la excepción
¿Y por qué no usar booleanos para indicar si no hubo errores?
Las excepciones al ser un objeto, nos proveen mayor detalle y permiten tomar acciones más precisas.
¿Y por qué no usar booleanos para indicar si no hubo errores?
Cada instrucción podría arrojar una excepción, además existen diferentes tipos de excepciones que pueden ser manejadas en un mismo catch.
try
{
carrito.descontarUnidades(producto,cantidad);
carrito.actualizarPrecioTotal();
}
catch (NullPointerException e)
{
JOptionPane.showMessageDialog( this,
"Error por null:", e.getMessage( ),
JOptionPane.ERROR_MESSAGE);
}
catch (Exception e)
{
JOptionPane.showMessageDialog( this,
"Problema actualizando carrito:", e.getMessage( ),
JOptionPane.ERROR_MESSAGE);
}Bajo qué condiciones (suposiciones) el método tendrá éxito.
Cuál será el resultado una vez que se termine su ejecución
Se agrega un nuevo elemento a la lista de estudiantes de la central.
La lista de estudiantes está inicializada.
El nombre no es null ni vacío.
El código es valido
public void agregarEstudiante( String pNombre, int pCodigo ) throws ExceptionSe produjo un error y se informó el problema con una excepción. El estudiante no fue agregado.
Contrato
Contrato
Conjunto de suposiciones, expresadas como condiciones que deben ser verdaderas para que el método se ejecute con éxito.
Pueden referirse a:
El valor de los atributos
El estado de una asociación
Condiciones sobre los parámetros de entrada
codigo
Estudiante
pNombre
Contrato
Conjunto de condiciones que deben ser verdaderas después de que el método ha sido ejecutado, siempre y cuando no se haya lanzado una excepción.
Pueden referirse a:
Valor de retorno
(si el método retorna algo)
Estado del objeto (valor de sus atributos) después de la ejecución del método
boolean
int double
incrementó
actualizó ...
Contrato
"si todas las condiciones de la precondición se cumplen antes de llamar el método, éste asume el compromiso de llegar a cumplir todas las condiciones incluidas en la postcondición"
El contrato es total, en el sentido de que si alguna de las precondiciones no se cumple, el método deja de estar obligado a cumplir la postcondición.
Contrato
Contrato
Lo que aparece en la precondición se debe suponer como cierto y se debe utilizar como si lo fuera. Si algo falla en la ejecución por culpa de eso, es responsabilidad de aquel que hizo la llamada al método sin cumplir el contrato.
Contrato
Un contrato sólo debe decir que lanza una excepción cuando, aún cumpliéndose todo lo pedido en la precondición, es imposible llegar a cumplir la postcondición. Eso quiere decir que ninguna excepción puede asociarse con el no cumplimiento de una precondición.
Contrato
Contrato
Contrato
Contrato
JAVADOC
Herramienta de generación automática de documentación
Contrato
Contrato
Decidir:
Precisar su contrato:
Identificación de entradas y salidas de los requerimientos funcionales
Tipos de atributos utilizados en el modelaje del mundo del problema
¿Qué información externa al objeto se necesita para resolver el problema que se plantea en el método?
¿Cómo se modeló esa información dentro del objeto?
Text