Title: Herencia Paquetes Excepciones
1HerenciaPaquetesExcepciones
2Herencia
- class A extends B especifica que la clase A
hereda datos y métodos de clase B. - La clase A tiene acceso a miembros de B con
modificador public, protected, o vacÃo
(cuando A y B están en el mismo paquete) - Variable super (privada) tiene acceso al objeto
de la superclase - En situaciones excepcionales puede interesar
definir una variable en la subclase con el mismo
nombre que la superclase (se tendrÃan huecos
diferentes de memoria)
3Ejemplo
- public class Ejemplo
- public static void main(String args)
- A anew B()
- B b new B()
- System.out.print("Valor de v en a "
a.v) // a.v66 - System.out.print("Valor de v en b "
b.v) // b.v8.0 -
-
- public class A
- private int x3 public int y4
- private int u5 public int v6
- public class B extends A
- private z 9 private double u public
double v - public B ()
- // this.x33 (ilegal)
- this.y44 // tambien valdrÃa super.y44
- // super.u55 (ilegal)
- this.u7
- super.v66
4Constructores
- Si A extends B, las llamadas explÃcitas a
constructores de B se hacen con
super(argumentos) - En tal caso, la llamada super(argumentos) debe
ser la primera instrucción en un constructor de A - Uso de this(...) y super(...) en un
constructor - Si no contiene ni super(...) ni this(...), se
ejecuta super() - Error super(...) this(....) ...
- Por tanto, la instrucción super() sólo se
ejecuta una vez. - Si una variable de una clase es, por ejemplo,
public int n 7 - Se asigna el valor 7 después de ejecutarse
super() en algún constructor. Después se
entrarÃa en el constructor de esta clase. Las
variables que primero se crean son las de la
superclase. - Mecanismo análogo para variables static
5Ejemplo
- public class A
- private int x
- public A ()
- this.x7
-
- public A (int x)
- this.xx
-
-
- public class B extends A
- private int y
- public B ()
- super() // omitiéndolo, también se
ejecuta - this.y5
-
- public B (int x, int y)
- super(x)
- this.yy
6Uso de protected
- Referido en clases.ppt
- Ejemplo en la clonación de un objeto (shallow
copy not deep copy) - Clase java.lang.Object
- protected Object clone()
- throws CloneNotSupportedException
- class R extends K
- public class K extends Object
- public void f () throws Exception
- this.clone() super.clone()
- Object o new Object()
- // o.clone() error de compilación
- R r new R()
- r.clone() // correcto
-
- public static void main(String args)
- String s"hola"
- //s.clone() error de compilación
-
7Overriding methods
- Un método se puede especializar, redefinir o
sustituir (overriding) en una subclase - El tipo de retorno, nombre del método, tipo y
número de argumentos debe ser el mismo - Las excepciones lanzadas (no descendientes de
RuntimeException) deben ser, como mucho, las
declaradas por el método a redefinir (o clases
descendientes) que no sean descendientes de
RuntimeException. - Los modificadores deben ser al menos tan
generales como los del método en la superclase
(por ejemplo, protected-gtpublic, pero no
protected-gtprivate) - super.ltmetodogt accede al método de la
superclase - Si el método en la superclase es final no se
puede hacer overriding. Seguridad o diseño
perfecto.
8Ejemplo
- public class Ejemplo
- public static void main(String args)
- B b new B()
- b.f(3)
-
-
- En clase A 3
- En clase B 3
- public class A
- public void f (int x)
- System.out.println("En clase A " x)
-
-
- public class B extends A
- public void f (int x)
- System.out.println("En clase B " x)
- super.f(x)
9Clases de expresiones asignaciones
- Diferencia entre clase en tiempo de compilación
(tipo declarado), y clase en tiempo de ejecución
(procedendia a través de new ...) de una
expresión. - Como ocurre con los tipos primitivos
- Una asignación ltvariablegtltexpresiongt (donde C
denota la clase en tiempo de compilación de
ltexpresiongt) es válida (en tiempo de compilación)
cuando la clase de ltvariablegt es C o una clase
ascendiente de C
10Operador instanceof castings
- Un casting de la forma (ltclasegt)ltexpresiongt
es válido en tiempo de compilación cuando la
clase de ltexpresiongt es ltclasegt, o bien una otra
ascendiente o descendiente de ltclasegt - Operador booleano instanceof
- ltexpresiongt instanceof ltclasegt
- Válido en tiempo de compilación si también lo es
(ltclasegt)ltexpresiongt - Devuelve true si la clase en tiempo de
ejecución de ltexpresiongt es ltclasegt o una
descendiente de ltclasegt - Para un casting válido en tiempo de
compilación, en tiempo de ejecución se produce
una java.lang.ClassCastException cuando no se
verifica que ltexpresiongt
instanceof ltclasegt
11Ejemplo
- public class Ejemplo
- public static void main(String args)
- Punto p1new Punto(1,2), p2new Punto(1,2)
- System.out.println("p1p2 " (p1p2))
- System.out.println("p1.equals(p2) "
p1.equals(p2)) -
- p1p2 false
- p1.equals(p2) true
- public class Punto extends Object
- private int x, y
- public Punto (int x, int y)
- this.xx this.yy
-
- // Lo mismo que para Strings.
- public boolean equals (Object o)
- if (o instanceof Punto)
- Punto p (Punto)o
- return this.xp.x this.yp.y
12Ligadura dinámica (I)
- Consiste en la asignación en tiempo de ejecución
del código a ejecutar para un determinado método
(en Java todos los métodos son virtuales, según
el formalismo de C) - La elección del código a ejecutar para la
instrucción (un solo argumento) - ltexpresiongt.ltmetodogt(ltargumentogt), en donde C1
y C2 son las clases estática y dinámica,
respectivamente, de ltexpresiongt consiste en - 1) Tiempo de compilación. Se determina la
cabecera del método a aplicar. Si existe
overloading de ltmetodogt en C1 - Se determinan las clases (en tiempo de
compilación) de ltargumentogt y se elige el método
más especÃfico definido para ltmetodogt en la
clase C1 - 2) Tiempo de ejecución. Una vez seleccionada la
cabecera a aplicar en paso 1) , si se ha hecho
overriding de ltmetodogt en C2 se aplica ligadura
dinámica (si no hay ligadura dinámica, se aplica
el método de la clase C1)
13Ligadura dinámica (II)
- Ejemplo
- algoritmo-desambiguacion-polimorfismo
- El algoritmo de selección es más complicado para
varios argumentos - Se considera aquel en que el número de
promociones sea mÃnimo (a igualdad, error de
compilación por ambigüedad). - Si para una promoción existen varios caminos
posibles (debido a la herencia múltiple de
Java), se considera el camino más largo.
14Ejemplo
- public class Ejemplo
- public static void main(String args)
- A array new A(), new B(), new C()
- for (int i0 ilt3 i)
- arrayi.f(3)
-
-
-
- En clase A 3
- En clase B 3
- En clase C 3
- class A
- public void f (int x)
- System.out.println("En clase A " x)
-
- class B extends A
- public void f (int x)
- System.out.println("En clase B " x)
-
15JerarquÃa de clases
- Si no se especifica herencia en una clase, se
supone que hereda de clase java.lang.Object - class A ... equivale a
class A extends Object ... - public class java.lang.Object
- public boolean equals(Object obj)
- public String toString()
- public Classlt? extends Objectgt getClass()
- obtiene clase en tiempo de ejecución
- protected void finalize()
- Llamada por el garbage collector antes de
destruir el objeto porque ha dejado de ser
referenciado - Los arrays son también instancias de una clase
subclase de Object
16Ejemplo Robots
- public class Ejemplo
- public static void main(String args)
- Robot r1,r2
- r1new Robot(1, 1) r1.avanzar(2)
- r2new RobotConFrontera(2, 1, 0, 0)
- r2.avanzar(-2)
- System.out.println("Robot1 "
r1.toString()) - System.out.println("Robot2 "
r2.toString()) -
-
- Robot1 Robot3, 3
- Robot2 Robot0, 1bordes 0, 0
17Ejemplo Robots (cont)
- public class Robot
- private int x, y
- public Robot (int x, int y)
- this.xx this.yy
-
- public void avanzar (int a)
- this.xa this.ya
-
- public int coordX ()
- return this.x
- public int coordY ()
- return this.y
- public void asignarX (int x)
- this.xx
- public void asignarY (int y)
- this.yy
- public String toString ()
- return "Robot" this.x ", " this.y
"" -
18Ejemplo Robots (cont)
- public class RobotConFrontera extends Robot
- private int limX, limY
- public RobotConFrontera (int x, int y, int
limX, int limY) - super(x,y)
- this.limXlimX
- this.limYlimY
-
- public void avanzar (int a)
- int huecoX(acoordX())-this.limX
- if (huecoXgt0)
- asignarX(acoordX())
- else asignarX(this.limX-huecoX)
- int huecoY(acoordY())-this.limY
- if (huecoYgt0)
- asignarX(acoordY())
- else asignarY(this.limY-huecoY)
-
- public String toString ()
- return super.toString() "bordes "
this.limX
19Clases y métodos abstractos
- Una clase es abstracta cuando no se pueden crear
instancias de ella. Es decir, si la clase A es
abstracta, es ilegal hacer new A(...). - Sin embargo, sà se pueden definir constructores
que pueden ser llamados por subclases con
super(...) - Un método abstracto se define sin implementación
en una clase abstracta. Las subclases deben
implementarlo
20Ejemplo
- public class Ejemplo
- public static void main(String args)
- Figura figuras new Figura2
- Punto p1new Punto(0,0), p2new Punto(1,0),
- p3new Punto(0,1)
- figuras0 new Triangulo("rojo", p1, p2,
p3) - figuras1 new Circulo("verde", p1, 1)
- for(int i0 iltfiguras.length i)
- System.out.println("Area "
figurasi.area()) -
-
-
- public abstract class Figura
- private String color
- public Figura (String color)
- this.colorcolor
-
- public abstract double area ()
21Ejemplo (cont)
- public class Punto
- private double x, y
- public Punto (int x, int y)
- this.xx this.yy
- public double valorX ()
- return this.x
- public double valorY ()
- return this.y
- public class Triangulo extends Figura
- private Punto p1, p2, p3
- public Triangulo (String color, Punto p1,
- Punto p2, Punto
p3) - super(color) this.p1p1 this.p2p2
this.p3p3 -
- public double area ()
- double athis.p2.valorX()-this.p1.valorX()
, - bthis.p2.valorY()-this.p1.valorY()
, - cthis.p3.valorX()-this.p1.valorX()
, - dthis.p3.valorY()-this.p1.valorY()
22Ejemplo (cont)
- public class Circulo extends Figura
- private Punto centro
- private double radio
- public Circulo (String color, Punto centro,
double radio) - super(color)
- this.centrocentro this.radioradio
-
- public double area ()
- return Math.PIthis.radiothis.radio
-
-
-
23Interfaces
- Una interface en Java es una colección de
definiciones de métodos (sin implementación) y de
valores constantes - Una interface es análogo a una clase abstracta
con todos sus métodos abstractos y variables
finales y estáticas con valor inicial. - Una clase A puede heredar de una sola clase
(extendsltltgtgtherencia simple) y puede heredar de
varias interfaces (implements ltltgtgtherencia
múltiple). - Ambigüedades no permitidas en herencia de
variables (en general Java no resuelve por sÃ
mismo las ambigüedades en ningún caso) - Todas las interfaces descienden de Object
- No se permiten ciclos en el grafo de clases e
interfaces
24Ejemplo (I)
- public class Ejemplo
- public static void main(String args)
- Pila p new Pila()
- p.introducir("abc") p.introducir("def")
- System.out.println("Pila " p)
- String s (String)p.extraer()
-
-
- Resultado Pila abc
- public interface Coleccion
- public int MAXIMO_NUMERO500
- public void introducir (Object o)
- public Object extraer ()
-
- import java.util.
- public class Pila extends Object implements
Coleccion - private ArrayList elementos
- public Pila ()
25Ejemplo (II)
- public void introducir (Object o)
- if (this.elementos.size()ltMAXIMO_NUMER
O) - this.elementos.add(o)
-
- public Object extraer ()
- Object ultimonull
- // Si hubiéramos hecho Object
ultimo, se habrÃa - // obtenido el error de compilación
- //Variable ultimo may not have been
initialized - if (!vacia())
- int nthis.elementos.size()
- ultimothis.elementos.remove(n-1)
-
- return ultimo
-
- public boolean vacia ()
- return this.elementos.size()0
-
- public String toString ()
26Ejemplo con genéricos (I)
- public class Ejemplo
- public static void main(String args)
- PilaltStringgt p new PilaltStringgt()
- p.introducir("abc") p.introducir("def")
- System.out.println("Pila " p)
- String s p.extraer()
- // Al usar genéricos, se hace
- // un casting automáticamente
-
-
- public interface Colección ltTgt
- public int MAXIMO_NUMERO500
- public void introducir (T o)
- public T extraer ()
-
- import java.util.
- public class Pila ltTgt extends Object
27Ejemplo con genéricos (II)
- public void introducir (T o)
- if (this.elementos.size()ltMAXIMO_NUMER
O) - this.elementos.add(o)
-
- public T extraer ()
- T ultimonull
- // Si hubiéramos hecho T ultimo, se
habrÃa - // obtenido el error de compilación
- //Variable ultimo may not have been
initialized - if (!vacia())
- int nthis.elementos.size()
- ultimothis.elementos.remove(n-1)
-
- return ultimo
-
- public boolean vacia ()
- return this.elementos.size()0
-
- public String toString ()
28Definición de interfaces
- public ... interface ltnombre-de-interfacegt
extends ltinterface1gt,ltinterface2gt ... - Una interface puede heredar de otras interfaces
- Las variables de la interface
- public ... lttipogt ltnombre-variablegt
ltvalorgt - Son variables estáticas y finales (constantes)
- Los métodos se definen sin código (igual que los
métodos abstractos) y cualquier clase que
implemente la interfaz los debe definir. El único
modificador admitido es el de privacidad. El
modificador abstract es opcional - Un paquete es un conjunto de interfaces, clases,
excepciones (y también de enumeraciones, errores
y anotaciones, como en java.lang)
29Una interface predefinida
- Ejemplo
- Interface java.util.IteratorltTgt
- public boolean hasNext()
- public T next()
- public void remove()
- En clase java.util.ArrayListltTgt
- public IteratorltTgt iterator()
30Ejemplo
- import java.util.
- public class Ejemplo
- public static void main(String args)
- Pais paisesnew Pais("Italia"),
- new Pais("Francia"),new Pais("España")
- Entero numerosnew Entero(3),
- new Entero(4), new Entero(1)
- Algoritmos.ordenar(paises)
- Algoritmos.ordenar(numeros)
- for (int i0 iltpaises.length i)
- System.out.println(paisesi)
- for (int i0 iltnumeros.length i)
- System.out.println(numerosi)
-
-
- España
- Francia
- Italia
- 1
31Ejemplo (cont)
- public interface Ordenable
- boolean menorQue(Ordenable a)
-
- public class Algoritmos
- public static void ordenar(Ordenable a )
- Ordenable temp
- int este
- for (int i0 ilta.length-1 i)
- este i
- for (int ji1 jlta.length j)
- if (aj.menorQue(aeste)) este
j - tempaeste aesteai aitemp
-
-
-
- public class Entero implements Ordenable
- private int valor
- public Entero (int n)
- this.valor n
32Ejemplo (cont)
- public boolean menorQue(Ordenable entero)
- Entero i (Entero) entero
- return valorlti.valor
-
- public String toString ()
- return String.valueOf(this.valor)
-
-
- public class Pais implements Ordenable
- private String nombre
- public Pais (String n)
- this.nombre n
- public boolean menorQue(Ordenable pais)
- Pais b (Pais) pais
- return nombre.compareTo(b.nombre)lt0
-
- public String toString ()
- return this.nombre
33Uso de la clase Collections
- ArrayListltIntegergt arr new
ArrayListltIntegergt() - arr.add(new Integer(3))
- arr.add(new Integer(5))
- arr.add(new Integer(4))
- System.out.println("Lista " arr)
- Object obb Collections.max(arr)
- System.out.println("MAXIMO" obb)
- Collections.sort(arr)
- System.out.println("Lista " arr)
- RESULTADO
- Lista 3, 5, 4
- MAXIMO5
- Lista 3, 4, 5
- DOCUMENTACIÓN
- Clase "java.util.Collections"
- public static ltT extends Comparablelt? super Tgtgt
34Uso de genéricos (I)
- Al usar genéricos, Java realiza los siguientes
pasos al compilar - 1) Precompilar (aquà aparecen los errores de
compilación existentes) - 4) Borrado de tipos (type erasure)
- Sustituir los tipos parámetros en clases y
métodos por la cota superior del parámetro
(Object si no tiene). Eliminar todos los ltgt
que aparezcan (erasure) en clases, métodos y
tipos con comodines (?). - 3) Insertar castings en los lugares en donde se
hacen llamadas a los genéricos - 4) Compilar el código resultante de los pasos
anteriores (con seguridad ya no aparecerán
errores de compilación ni contendrá genéricos ni
comodines) - El borrado de tipos se utiliza para hacer el
código 1.5 compatible con las versiones
anteriores de Java
35Uso de genéricos (II)
- En el paso 1)
- Dentro de un genérico, una expresión compila
correctamente si compila para cualquier valor
posible de los tipos parámetros - Una asignación a un tipo con comodÃn compila si
el comodÃn es asignable. Por ejemplo - ArrayListlt? extends Objectgt ArrayListltStringgt
es correcto - Pero no al contrario
- Conceptualmente se puede considerar que el tipo
ArrayListlt? extends Objectgt es ascendiente de
ArrayListltStringgt - En otras expresiones involucrando a tipos con
comodÃn, la expresión compila correctamente si
compila para cualquier valor posible de los
comodines.
36Uso de genéricos (III)
- Debido al algoritmo anterior, dentro de un
genérico - No se permite el uso de instanceof (porque
siempre se estarÃa haciendo instanceof
cota-superior ) - Tampoco se permite hacer new T porque siempre
se harÃa new cota-superior(). Tampoco es
posible new T... por la misma razón - Pero sà se permite el uso de casting al tipo
parámetro - En la definición de un tipo parámetro sólo se
puede utilizar extends, pero no super (sólo
posible una cota superior pero no inferior)
37Ejemplos
- ArrayListltStringgt l1new ArrayListltStringgt()
- ArrayListlt? extends Objectgt l5
- // vale también (equivalentemente)
- // ArrayListlt?gt l5
- l5l1 // compila bien porque existe
un valor válido // de ? para que sea
posible - // l1l5 error de compilacion
- // l5.add(new Object())
- // debe ser válido para cualquier valor de ? y
por // tanto se obtiene un - // error de compilación porque se
intentarÃa hacer ?Object y puede no ser
posible (serÃa posible al haber puesto ? super
Object) - // l5.add(ejemplo) tampoco compila
- // por el mismo motivo
- l5.add(null) // compila ya que null es de
cualquier tipo - l1.add(hola)
- Object obl5.get(0) // sà funciona
-
38Dualidad (comodines)/(métodos genéricos)
- Ejemplo (En clase A)
- static void fromArrayToArrayList
- (Object a, ArrayListlt?gt c)
- for (Object o a)
- c.add(o)
- // error de compilación
- // cannot find symbol
-
- static ltTgt void fromArrayToArrayList
- (T a, ArrayListltTgt c)
- for (T o a)
- c.add(o) // correcto
-
- Integer numsnew Integer(0), new Integer(1)
- ArrayListltIntegergt numsArr
- new ArrayListltIntegergt()
- A.fromArrayToArrayList(nums, numsArr)
- System.out.println("Numeros " numsArr)
39Arrays clases y asignaciones (I)
- Observación para tener en cuenta en los ejemplos
siguientes - Por cada array hay una clase distinta (obtenida
mediante getClass, cuya clase padre es
Object, obtenida mediante getSuperclass) - Pero se permiten cosas como
- ObjectString
- Sólo se modifica un puntero
- (Object)E, con el tipo estático de E siendo
String - (String)E, con el tipo estático de E siendo
Object - Puede producir ClassCastException
40Arrays clases y asignaciones (II)
-
- EJEMPLO
- public static void main(String args)
- String strings"uno", "dos"
- Object objects1new Object(), new
Object(), - objects2"uno", "dos"
- Classlt? extends Objectgt
- class1strings.getClass(),
- class2objects1.getClass(),
- class3objects2.getClass(),
- class4class1.getSuperclass(),
- class5class2.getSuperclass(),
- class6class3.getSuperclass()
- System.out.println("Clases" class1
class2 class3 - class4 class5 class6)
- objects1strings // correcto
- // stringsobjects es incorrecto
- strings(String)objects1
41Definición de genéricos propios (ejemplo, I)
- class Singleton ltTgt // conjunto con un único
elemento - T elem
- Singleton()
- void añadir(T e )
- if (elemnull) eleme
- else
- System.out.println("Ya lleno")
-
-
- class B ltTgt
- T elem (T)new Object()
- void set(T t) elemt T get () return
elem -
- class Lista ltTgt // ArrayList tiene código
similar - T elementos
- int num
- Lista (int n) this.elementos(T)(new
Objectn) - // porque new Tn no compila
- void añadir(T e)
42Definición de genéricos propios (ejemplo, II)
- public class Main
- public static void main(String args)
- SingletonltStringgt sinnew
SingletonltStringgt() - sin.añadir("hola") sin.añadir("adios")
- BltIntegergt unB new BltIntegergt()
- unB.set(new Integer(3)) Integer junB.get()
- // SIN CLASSCASTEXCEPTION
- // Integer o unB.elem ? CLASSCASTEXCEPTION
- Blt? extends Numbergt otroB new BltIntegergt()
- // Number o otroB.elem CLASSCASTEXCEPTION
- Object o otroB.elem // SIN
CLASSCASTEXCEPTION -
- Lista ltIntegergt a new
ListaltIntegergt(3) - a.añadir(new Integer(3))
a.añadir(new Integer(4)) - Integer i a.get(0)
- // NO PRODUCE CLASS CLASSCASTEXCEPTION
- Object objetosa.elementos
- // NO PRODUCE CLASS CLASSCASTEXCEPTION
43Definición de genéricos propios (ejemplo, III)
- Observaciones
- Instrucciones como
- 1) T elem (T)new Object()
- dentro de un genérico con parámetro T
- 2) ArrayListltStringgt l new ArrayList()
- no producen errores de compilación, pero deben
usarse con precaución, pues son potencialmente
generadoras de errores de ClassCastException.
De hecho el compilador de java emite un mensaje
del siguiente estilo si se utilizan - Note The file Ejemplo.java uses unchecked
or unsafe operations.
44Otros detalles para genéricos (I)
- No admisible para una clase genérica el uso del
tipo en un método estático - class A2 ltT1gt
- static T1 f () return null
- // incorrecto
- La razón es que en este caso se deberÃa utilizar
un método genérico - Posible uso de interfaces en cotas para tipos
parámetro de genéricos - class D ltT1 extends Object ComparableltT1gt
java.io.Serializable, - T2 extends ComparableltT1gtgt
- // Uso de "" para descendendencia de
interfaces - // Posible uso de "T1" desde su definición
hasta final de declaración de tipos argumentos -
- class E ltT1 extends ComparableltT1gtgt
- // en lugar de "" en este caso
45Otros detalles para genéricos (II)
- Se puede hacer asignaciones entre tipos con
comodÃn - ArrayListlt? extends Numbergt l1
- ArrayListlt? extends Integergt l2
- l1l2 // correcto
- l2l1 // incorrecto
- Casting (T)E a un tipo T con comodÃn es
admisible en compilación, si es posible
Ttipo-de-E o tipo-de-ET - Caso especial en método getClass en clase
Object - public final native Classlt? extends Objectgt
getClass() - Pero su tipo estático de retorno es Classlt?
extends Xgt, siendo X el tipo estático del objeto - Ejemplo
- Classlt? extends Objectgt c hola.getClass()
- // correcto
- Classlt? extends Stringgt c hola.getClass() //
correcto - ClassltStringgt c hola.getClass()
- // incorrecto
46Excepciones
- class Ejemplo
- public static void main(String args)
- Ejemplo p new Ejemplo ()
- p.g()
- System.out.println("Final de método
main") -
- void f (String s)
- System.out.println(s.toString())
- System.out.println("Final de método f")
-
- void g ()
- f(null)
- System.out.println("Final de método
g") -
- Build Successful
- java.lang.NullPointerException
- at Ejemplo.f(Ejemplo.java8)
- at Ejemplo.g(Ejemplo.java12)
- at Ejemplo.main(Ejemplo.java4)
47Excepc. en tiempo de ejecución
- java.lang.RuntimeException
- java.lang.NullPointerException (se ejecuta
- x.miembro para una variable x con valor
null) - java.lang.IndexOutOfBoundsException (acceso
- a un Ãndice no existente en un array)
- java.lang.ArithmeticException (division por
cero) - java.lang.ClassCastException (error de casting)
- Jerarquia de clases
- java.lang.Object
-
- ----java.lang.Throwable
-
- ----java.lang.Exception
-
- ----java.lang.RuntimeException
-
- ----java.lang.Arithmet
icException - Si ningún método hasta el main atrapa una
excepción e, se llama a e.printStackTrace()
(método de java.lang.Throwable)
48Atrapando excepciones
- class Ejemplo
- public static void main(String args)
- Ejemplo p new Ejemplo() p.g()
- System.out.println("Final de método main")
- void f (String s)
- System.out.println(s.toString())
- System.out.println("Final de método f")
-
- void g ()
- try
- System.out.println("Antes de f(null)")
- f(null)
- System.out.println("Despues de
f(null)") - catch (NullPointerException e)
- System.out.println("Excepcion de
puntero nulo") - catch (IndexOutOfBoundsException e)
- System.out.println("Excepcion de indice
erroneo") - finally
- System.out.println("Final de bloque
try")
49Bloque try-catch
- Antes de f(null)
- Excepcion de puntero nulo
- Final de bloque try
- Final de método g
- Final de método main
- Bloque try-catch-finally permite capturar una
excepción. Parte finally es opcional. Si hay
varias partes catch se ejecuta la primera
posible. El catch utiliza la clase dinámica. - Es posible uso de try-finally (sin catch), aunque
no se puede usar try solo. Se obtendrÃa - Antes de f(null)
- Final de bloque try
- java.lang.NullPointerException
- at Ejemplo.f(Ejemplo.java6)
- at Ejemplo.g(Ejemplo.java12)
- at Ejemplo.main(Ejemplo.java3)
50Utilidad de excepciones
- Excepciones son objetos que definen el estado de
la aplicación cuando se producen situaciones
anómalas. - Beneficios (erroressituaciones anómalas)
- 1) Separación entre errores y código normal
- 2) Propagación de errores en la pila de métodos a
ejecutar. - 3) Agrupación de tipos de errores y
diferenciación - La alternativa en programación sin excepciones es
el uso de muchos if
51Clases de excepciones
- Excepciones en tiempo de ejecución
- Excepciones comprobadas (no en tiempo de
ejecución) - Predefinidas en Java (java.io.IOException, ...)
- Definidas por el programa
- Evitar errores de compilación
- Si un método puede lanzar una excepción
comprobada debe especificarlo en su cabecera con
throws (de la clase de la excepción o de una
clase ascendente) - Puede lanzarla cuando no se hace ningún catch
que la atrape
52Excepciones definidas en un programa
- Se aconseja crearlas como excepciones comprobadas
(heredan de Exception pero no de
RunTimeException) - Se puede utilizar instrucción throw
ltexpresion-excepciongt para lanzar la excepción. - Parte throws debe ser compatible en tiempo de
compilación con excepciones lanzadas con throw. - La instrucción throw admite cualquier objeto
Throwable, aunque lo habitual es usar sólo
excepciones - Subclases de Throwable son Error y
Exception (los errores se refieren a
situaciones graves) - Un catch de una excepción ya capturada es
inválido (en tiempo de compilación)
53Ejemplo
- class Exception2D extends Exception
- public Exception2D (String mensaje)
- super(mensaje)
-
-
- // Si algún método (como el main) crea Rectas,
deberá - // o bien hacer throws de Exception2D o bien
- // atrapar la excepción con bloque try-catch
- class Recta2D
- private Punto2D p1, p2
- private void crearRecta2D (Punto2D p1,
Punto2D p2) - this.p1p1
- this.p2p2
- // Recta a partir de dos puntos
- public Recta2D (Punto2D p1, Punto2D p2)
- throws Exception2D
- if (p1.equals(p2)) // definido en clase
Punto2D - throw new Exception2D("Una recta se
crea con - dos puntos distintos")
54Ejemplo (cont)
- // Recta axbyc0
- public Recta2D (double a, double b, double c)
throws Exception2D - if (a0 b0)
- throw new Exception2D("En una recta
no puede - ser ab0")
- else if (a0)
- crearRecta2D(new Punto2D(0, -c/b),
- new Punto2D(1, -c/b))
- else if (b0)
- crearRecta2D(new Punto2D(-c/a, 0),
- new Punto2D(-c/a, 1))
- else
- crearRecta2D(new Punto2D(0, -c/b),
- new Punto2D(-c/a, 0))
-
- public Punto2D interseccion (Recta2D recta)
throws Exception2D - .... throw new Exception2D(Rectas
paralelas o - coincidentes)
- ....
55Uso de assert
- Sintaxis
- assert condicion
- Si no se verifica la condición, se emite una
- java.lang.AssertionError
- extends java.lang.Error
- Posible uso en
- Lugares intermedios de código en los ciertas
condiciones se cumplen con certeza - Precondiciones y postcondiciones en ejecución de
métodos - Por defecto, no se permiten. Es necesario poner
las opciones - javac ea
- java -ea
56Clases internas
- Clases internas
- anidadas, locales y anónimas
- Facilidad del lenguaje. Normalmente no se
utilizan. - Clase anidada un miembro de otra clase. Se
utiliza cuando la clase anidada es local - Clase local análogo a las variables locales en
los métodos - Clase anónima se crea una instancia definiendo a
la vez miembros y sin dar un nombre a la clase - Al compilar una clase con clases internas se
generan varios .class
57Ejemplo
- public class Robot
- private int x
- private DescripcionRobot descripcion
- public Robot (int x)
- this.xx
- this.descripcionnew DescripcionRobot()
-
- // CLASE ANIDADA
- public class DescripcionRobot
- private String nombre, color
- public DescripcionRobot()
- if (xgt0)
- this.nombre"A"
- this.color"blanco"
- else
- this.nombreB"
- this.colorrojo"
-
-
58Ejemplo (cont)
- public void avanzar (int d)
- this.xd
-
- public int valorX ()
- return this.x
-
- public void asignarX (int x)
- this.xx
-
- public String toString()
- return "Robot(" this.x ")"
-
-
- - La clase anidada puede ser static (clase
Robot.DescripcionRobot) - - Las clase anidada tiene acceso a los miembros
de la clase que la contiene - - Las instancias se crean, por ejemplo, mediante
- Robot.DescripcionRobot r
- (new Robot(3)).new DescripcionRobot()
59Ejemplo (cont)
- public class Ejemplo
- public static void main(String args)
- Robot r1 , r2, r3
- //CLASE LOCAL
- class RobotConFrontera extends Robot
- private int limX
- public RobotConFrontera (int limX,
int x) - super(x)
- this.limXlimX
-
- public void avanzar (int a)
- int huecoX(avalorX())-this.limX
- if (huecoXgt0)
- asignarX(avalorX())
- else asignarX(this.limX-huecoX)
-
-
- r1new RobotConFrontera(0, 1)
- r1.avanzar(-3)
60Ejemplo (cont)
- // CLASE ANONIMA
- // equivale a new RobotConFrontera(0,2)
- r2new Robot(2)
- private int limX0
- public void avanzar (int a)
- int huecoX(avalorX())-this.limX
- if (huecoXgt0)
- asignarX(avalorX())
- else asignarX(this.limX-huecoX)
-
-
- r2.avanzar(-3)
- System.out.println("r2 " r2)
-
61Clases internas
- En una clase interna
- Se pueden usar las variables accesibles en ese
instante - Se puede utilizar this y
ltnombre-clasegt.this para desambiguar. - En un clase local o anónima, si se utiliza una
variable local o argumento, debe ser final. - Si hay ambigüedad, Java toma siempre la
referencia más cercana - No se pueden poner elementos static
- En una clase anónima ,se puede hacer new ... de
algo abstracto (class o interface) , con tal
que se definan todos sus métodos abstractos
dentro de dicha clase. - Ejemplos de clases anidadas en javax.swing.JEditor
Pane
62Alternativas (sin clases internas)
- public class DescripcionRobot
- private String nombre, color
- private int x
- public DescripcionRobot(int x)
- if (xgt0)
- this.nombre"A"
- this.color"blanco"
- else
- this.nombreB"
- this.colorrojo"
-
-
-
-
- public class Robot
- private int x
- private DescripcionRobot descripcion
- public Robot (int x)
- this.xx
63Tipos enumerados (I)
- enum Color ROJO, VERDE
- enum Comunidad
- MADR (1, "Comunidad de Madrid"),
- CASM (5, "Castilla la Mancha")
- private final int provincias
- private final String nombre
- Comunidad (int provincias, String nombre)
- // no se permite public, al no permitir
instancias - this.provinciasprovincias
- this.nombrenombre
-
- public String descripcion ()
- return this.toString() ""
this.provincias "," - this.nombre ""
-
-
- public class Main
- public static void main(String args)
- Color cc Color.valueOf("ROJO")
64Tipos enumerados (II)
- for (Comunidad c Comunidad.values())
- System.out.println(c.descripcion())
-
- switch (cc) // se puede usar en un
switch - case ROJO
- System.out.println("Color Rojo")
- break
- case VERDE
- System.out.println("Color
Verde") - break
-
-
-
- ColorROJO
- Igualtrue
- ColorVERDE
- Igualfalse
- MADR1,Comunidad de Madrid