Contenido de certificación
Buscar
Social
Ofertas laborales ES
« ¿Cuál es la salida del siguiente programa y por qué? | Main | Más sobre Java 7 »
lunes
may062013

Pregunta sobre excepciones

Tenemos dos códigos: se pide en cada uno de ellos, decir si compila, y en tal caso, comentar la salida en tiempo de ejecución (lo más detallada posible).
CÓDIGO 1
package scjp;
public class Pregunta {
private int a = 0;
private int b = 10;
private int c = b / a;
public Pregunta() {
System.out.println("Hola JavaHispaneros "+c);
}
public static void main(String args[]) {
Pregunta p = new Pregunta();
}
}

package scjp;
public class Pregunta {
private int a = 0; private int b = 10; private int c = b / a;
public Pregunta() { System.out.println("Hola JavaHispaneros "+c); }
public static void main(String args[]) { Pregunta p = new Pregunta();
}}

 

CÓDIGO 2

package scjp;

 

public class Pregunta {

 

private D d = new D();

 

public Pregunta() {

System.out.println("Por aquí estamos otra vez " + d);

}

 

public static void main(String args[]) {

Pregunta p = new Pregunta();

 

}

 

class D {

 

D() throws PersonalException {

throw new PersonalException();

}

 

}

 

class PersonalException extends Exception {

 

}

}

 

Reader Comments (6)

Primer.

El primer código compilará sin problemas, pero lanzará una excepción al ejecutarse. Concretamente al instanciar la clase Pregunta, ya que es en ese momento cuando se evalua "b/a" (y a es cero)

El segundo código no compilará, ya que el constructor de D lanza una excepción "checked", y se está utilizando en la declaración del atributo "d" de Pregunta.

Para que compile, hay que declarar que el constructor de Pregunta lance una PersonalException (sí, aunque no se haga explícitamente ahí la asignación), y por supuesto, declararla también en el main.

mayo 7, 2013 | Registered Commenteradeteran

Ok, la respuesta es correcta @adeteran.

Mi pregunta es: ¿qué entiendes exactamente por excepciones "checked"?

mayo 8, 2013 | Registered Commenterjcarmonaloeches

Las que estás obligado a declarar en el método, cuando pueden ser lanzadas ¿no?.

A efectos prácticos, todas las Exception (y descendientes) que no son RuntimeException (y descendientes). O si queremos ser más completos, y añadir todo lo lanzable, sería "checked" la clase Throwable y sus descendientes, pero no lo serían las clases Error y RuntimeException, y sus respectivos descendientes ("unchecked").

Si PersonalException heredara de RuntimeException, el código compilaría tal y como está.

mayo 9, 2013 | Registered Commenteradeteran

Buen punto de vista @adeteran. Veo muy práctico el consejo de "aquellas excepciones que son definidas en tiempo de desarrollo y especificadas". Al fin y al cabo, son las que se pueden controlar.
Mi pregunta es, ¿por qué Java tiene la limitación de no saber reaccionar a una división entre cero?

mayo 19, 2013 | Registered Commenterjcarmonaloeches

Java sí reacciona ante una división por cero. El mayor problema lo tienen los enteros, porque lanza una excepción.
Se puede usar un bloque try..catch en estos casos:
En los casos de double y float, el resultado es un INFINITY

http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html
http://docs.oracle.com/javase/7/docs/api/java/lang/Float.html

int divisor = 0;
try {
int dividendo = 10 / divisor
} catch (ArithmeticException ex) {
System.out.println("División por cero.");
}

Para más información:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.2

mayo 20, 2013 | Registered Commenterchoces

Hola @choces, gracias por el punto de vista.
Más bien lo que quería decir es que Java permite definir el siguiente código:
int divisor = 0;
int dividendo = 10 / divisor;
sin necesidad de detectar que aquí es necesaria una comprobación de excepción aritmética. Es decir, en tiempo de compilación, no es capaz de preever este problema (si en tiempo de ejecución).
Esto es lo que @adeteran define como excepción no "chequeada" (sólo es capaz de verla en tiempo de ejecución, al no estar especificada como tal, no es capaz de obligar a definirla en tiempo de compilación, lo que obliga a tener la posibilidad de fallo).
Los creadores de Java podrían, en este caso, haber determinado por norma que cualquier división pudiera lanzar esta excepción, pero es que, si nos fijamos, la división no es una operación de clases, si no de operadores aritméticos normales. Es decir, escapa de la programación orientada a objetos, que si permite definir excepciones ante métodos que se preveen que puedan lanzarla.
Es la explicación que, a día de hoy, puedo entender.
Un saludo,

mayo 20, 2013 | Registered Commenterjcarmonaloeches

PostPost a New Comment

Enter your information below to add a new comment.

My response is on my own website »
Author Email (optional):
Author URL (optional):
Post:
 
Some HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>