2. SENTENCIAS IF Y
SWITCH
Cubre el objetivo:
2.1 Develop code that implements an if or switch
statement; and identify legal argument types for these
statements.
3. Sentencia if - else
La sentencia básica es:
El else es algo opcional, no es obligatorio
usarlo.
Los corchetes también son opcionales, es
importante tener en cuenta que sin los
conchetes solo se ejecuta la línea inmediata
al if En el caso de que x sea menor
que 3, no se ejecuta la línea
inmediata al if, pero las demás si
4. Sentencia if - else
Es importante aclarar que aunque
puede ir if sin else, no se puede que
halla un else sin if.
También se puede usar un else if para
ahorrar líneas y simplificar el código
5. Expresiones legales para las
sentencias if
Siempre en un if debe evaluarse un
booleano, ya sea una asignación, una
comparación o un método
Suponiendo que trueInt vale 1, y falseInt vale
0, entonces:
Sentencia Resultado
if (trueInt) Ilegal, el if no puede evaluar un int
if (trueInt == true)
if (falseInt == false)
Ilegal, trueInt y falseInt no es
boolean, no se pueden comparar
if (1) 1 no es booleano, es ilegal
if (trueInt == 1)
if (falseInt == 0)
TrueInt es entero y vale 1, son
iguales, el resultado es true, y es
legal
6. Asignaciones en un if
En un if se pueden usar asignaciones, pero solo si se
usa una variable booleana (o el wrapper Boolean), y el
resultado siempre es true, por lo tanto siempre entra
dentro de la sentencia.
La sentencia compila, porque
boo es booleano, en el if boo se
le asigna a true, y se ejecuta el
bloque del if.
La sentencia no compila, porque
x es int, se necesita solo boolean
7. La sentencia switch
La forma básica del switch es:
El switch solo puede evaluar expresiones de tipo
char, byte, short, int y Enum. La expresión no compila si
se usa un tipo de variable diferente inclusive long, float
y double. Conclusión la expresión debe ser compatible
con int o un Enum.
Por otro lado el valor del case debe ser una constante
en tiempo de ejecución, esto significa que solo se
pueden usar constantes o variables final que tienen
asignadas un valor. a es una constante que vale 1,
por lo tanto compila en este
punto
b es una variable que aunque es final
no esta inicializada como constante,
por lo tanto aquí no compila y arroja
error
8. La sentencia switch
También hay que tener en cuenta el
alcance de una variable.
Por otro lado no pueden existir dos casos
con el mismo valor
En los switch se pueden usar
wrappers y manejar outboxing
Aunque g es byte y es válido por el
switch, el compilador sabe que 128 es
mayor que el tamaño máximo de una
variable byte, y arroja error de compilación
En este punto se presenta un error de
compilación, porque el caso 80 ya se
presentó, esta repetido
9. La sentencia switch
Cuando se usa un case la única forma
de detener la sentencia es con un
break, si no existe el sistema sigue
ejecutando los otros casos hasta
terminar el switch
Como no hay un break entonces se
ejecutan todos los casos después del
green, el resulado es:
Green blue done
10. La sentencia switch
Por último, se puede decir que el caso
default no va de último
obligatoriamente:
11. CICLOS E ITERACIONES
Cubre el objetivo
2.2 Develop code that implements all forms of loops and
iterators, including the use offor, the enhanced for loop (for-
each), do, while, labels, break, and continue; and explainthe values taken
by loop counter variables during and after loop execution.
12. Uso del ciclo while
La forma básica es:
En el while se maneja la misma
filosofía que se explicó en la sentencia
if. Solo se pueden manejar booleanos
Sentencia Explicación
int x = 1;
while (x) { }
No compila porque x no es booleano es
entero
int x = 1;
while (x = 5) { }
No compila, para que funcione x debe
ser booleabo
while (x == 5) { } Es valido, es una prueba de igualdad
while (true) { } Compila, se usa un booleano, el
problema es que el ciclo nunca termina
13. El cliclo while
En el ciclo while solo se pueden usar
variables que sean declaradas
previamente
Esto es un error de compilación porque
fuera que se esta evaluando un entero y
no un booleano, se esta declarando dentro
del mismo while
14. El ciclo do
Este ciclo es igual al while si no que la
evaluación se hasta hasta el final del
bloque, por lo tanto siempre
entra, ejecuta el bloque y después
evalúa el resultado
Al final de la sentencia (después del
while), siempre debe haber un punto y
El bloque siempre se ejecuta por
lo menos una vez, en este caso
imprime Inside loop, y luego se
da cuenta que es falso y no
ejecuta más.
15. El ciclo for básico
El for básico esta compuesto de tres
partes: La declaración e inicialización
de variables, la expresión booleana y
la condición de iteración.
Estas tres secciones están separadas
por puntos y comas.
Se pueden declarar e inicializar varias
variables del mismo tipo, y se separan
con comas
16. El ciclo for básico
Es importante ponerle atención al
alcance de las variables de los for.
En la sección de condicionales solo se
puede usar una sola condición.
El alcance de la variable x es solo
para el for, por lo tanto existe un
error de compilación, porque se
usa después de los corchetes
Sentencia Explicación
for (int x = 0; ((((x < 10) && (y-- > 2)) | x
== 3)); x++) { }
Solo existe una sola condición, es algo
compleja pero es solo una, por lo tanto
compila
for (int x = 0; (x > 5), (y < 2); x++) { } Existen dos condiciones diferentes, no
compila
17. El ciclo for básico
La última sección es una acción que se
ejecuta en cada ciclo, no es necesario
que sea un booleano ni que evalué una
expresión
Los for requieren las tres secciones, asi
se usen o no, por ejemploEste ciclo for tiene las tres
secciones, aunque no las
declaran, en este caso se
vuelve un ciclo infinito
La sentencia compila, y se
ejecuta sin ningún
problema, el resultado es
iterate
iterate
18. El for básico
El ciclo for puede tener varias
declaraciones en la primera
sección, para la segunda sección solo
se puede usar una sola condicional, y
en la tercera varias condicionales
Declaración de varias
variables de un mismo tipo
Una sola condicional
compuesta
Se manejan dos
condicionales separadas
por comas
19. El for avanzado
Existe un for especializado para los
arrays y las colecciones.
La expresión esta compuesta de dos
partes:
◦ La declaración: La variable es nueva, y debe
ser compatible con los tipos de elementos
que componen el arreglo, y es al que se le
asignan los elementos dentro del ciclo.
◦ La expresión: Indica el array que se quiere
Este for simplificado
permite recorrer la
colección
20. El for avanzado
De acuerdo a lo siguiente:
int x;
long x2;
Long [] La = {4L, 5L, 6L};
long [] la = {7L, 8L, 9L};
int [][] twoDee = {{1,2,3}, {4,5,6}, {7,8,9}};
String [] sNums = {"one", "two", "three"};
Animal [] animals = {new Dog(), new Cat()};
Usos legales Usos ilegales
for(long y : la ) ;
for(long lp : La) ;
for(int[] n : twoDee) ;
for(int n2 : twoDee[2]) ;
for(String s : sNums) ;
for(Object o : sNums) ;
for(Animal a : animals) ;
for(x2 : la) ;
for(int x2 : twoDee) ;
for(int x3 : la) ;
for(Dog d : animals) ;
21. Break, return y continue
Existen formas para romper el ciclo, y se puede hacer
de varias formas, cada una tiene un alcance y un
comportamiento distinto.
Break: Esta sentencia detiene inmediatamente la
ejecución del ciclo y continua en la línea inmediata
después del bloque. Esta sentencia se puede usar en
ciclos y en switch
Continue: Esta sentencia solo se puede usar en los
ciclos, y sirve para detener una iteración, es decir
detiene el ciclo actual y continua con la siguiente
iteración.
Return: Esta instrucción si hace parte de los métodos
más que de los ciclos, y sirve para ponerle fin a un
método como tal, si va dentro del ciclo, pues lo termina
con método y todo, a su vez también retorna un valor o
variable al método invocador.
22. Break, return y continue
Comportamiento dentro de ciclos anónimos:
◦ Tanto el break como el continue tienen un
comportamiento normal en este tipo de ciclos ya
que es donde se da más común
Normalmente el ciclo se ejecutaría
infinitamente pero en este caso se
ejecuta una sola vez pues la
sentencia break rompe el ciclo
En este caso pues no
termina el ciclo sino lo que
hace es detener la
iteración y continuar en la
siguiente.
23. Break, return y continue
Sentencias marcadas:
◦ En java se puede colocar justo antes de iniciar el
ciclo una marca o label el cual sirve de bandera
para que el break o el continue puedan
ejecutarse al ciclo correspondiente
Es importante tener en cuenta que cuando se hace el
continue y la marca el sistema ya no tiene en cuenta
los for si no que se remite directamente al for de la
marca en este caso el primero
24. Break, return y continue
Sentencias marcadas:
En este caso al igual con el anterior el sistema no tiene en
cuenta el ciclo que esta ejecutando sino el que corresponde a
la marca es decir el segundo for
25. MANEJO DE
EXCEPCIONESCubre los objetivos:
2.4 Develop code that makes use of exceptions and exception handling
clauses (try, catch, finally), and declares methods and overriding methods that
throw exceptions.
2.5 Recognize the effect of an exception arising at a specific point in a code
fragment. Note that the exception may be a runtime exception, a checked
exception, or an error.
26. Uso del try-catch
El principal elemento para controlar las excepciones
es mediante un conjunto de sentencias llamadas try
catch, por medio de este mecanismo cada vez que
ocurra una excepción o anomalía en el bloque try se
direcciona directamente al bloque catch.
27. Uso del finally
El finally es un bloque que va después del catch, y se hace
para poder ejecutar un bloque de código al final del
procedimiento, sin importar si se presentó una excepción o
no, basicamente lo que se busca es poder tener una forma
de colocar los objetos en un estado que no desestabilice la
aplicación después como cerrar un socket, quitar una
conexión a una base de datos, cerrar un archivo.
Importante, el bloque finally siempre va al final, y
siempre se ejecuta, ya sea después del bloque try o
después del bloque catch, pero siempre se ejecuta
28. Formas legales de bloque try
catch finally
El bloque siempre tiene que ir en el
orden try - catch - finaly
También puede ir try - finally
29. Formas ilegales de bloque try
catch finally
No se puede poner un bloque solo, tiene
que ir el try con catch o con finally
Tampoco se puede colocar nada entre
los bloques estos deben ser
consecutivos, uno después de otro sin
interrupciones
30. Propagación de excepciones
Las excepciones una vez se producen y
si no están controladas entonces se
propagan al método que las llamó y así
sucesivamente hasta llegar al método
principal o main.
31. Árbol de herencia de las
excepciones
Todos los errores
y excepciones
heredan de la
clase throwble.
La diferencia
entre error y
excepcion es que
los errores son
situaciones que
con errores de
programación y
que no se pueden
controlar, como
un
outOfMemoryErro
r
32. Árbol de herencia de las
excepciones
Una excepción por el contrario si se
puede controlar y se da en su mayoría
porque existe una condición que no
permite la completa ejecución de la
aplicación.
De throwable se puede destacar un
método que se llama
printStackTrace, este método permite
imprimir toda la pila de excepción e
indica que excepción se disparó
33. Manejando el nivel de herencia
en las excepciones
Como ya dijimos las excepciones manejan una
herencia, por lo tanto el catch que se maneja en
lo posible es mejor usando la excepción
específica que se quiere tratar, de esta forma se
le dará un uso más potente a el catch y las
aplicaciones serán mucho más completas.
La funcionalidad
es la mismaMejor usar esta opción
más especializada y
versatil
34. Manejo de múltiples
excepciones
Como ya vimos es mejor usar un catch
especializado para cada tipo de
excepción, sin embargo cuando una
excepción sucede java primero busca un
catch con la excepción específica, si no
la encuentra entonces busca la padre y
así sucesivamente.
De acuerdo a esto hay que tener en
cuenta que no se puede poner nunca
una excepción padre y luego una hija en
el orden de los catch, si no es así
entonces se tiene un error de
compilación.
35. Manejo de múltiples catch
Este caso se
presenta siempre
que no encuentre
el archivo
especifico
Este caso
se da
cuando no
puede
escribir o
leer en el
archivo
especificado
36. Manejo de múltiples catch
Por otro lado es importante
especificar que IOException es
padre de FileNotFoundException,
por lo tanto primero va el hijo y de
últimas el padre, al Contrario es
error de compilación
37. Uso de throws
La instrucción throws va en el encabezado
del método y sirve para listar las excepciones
que el método puede lanzar.
La sentencia anterior indica que el método
puede lanzar las excepciones MyException1
y MyException2, al tener esta instrucción ya
no es necesario tratarlas con un try-catch si
no que se propaga esta función al método
que lo llama.
Cada método debe manejar sus propias
excepciones ya sea por medio de un catch o
por medio de un throws
38. Uso de throws
Para efectos de compilación deben
ser tratadas todas las excepciones
que no derivan de
java.lang.RuntimeException.
EOFException no deriva de
RuntimeException por lo tanto toca
Controlarla, en este caso se hace con
Throws
NullPointerException deriva de
runtimeException, por lo tanto
No es necesario para el compilador
Que este controlada y no arroja
error de compilación
39. Uso de excepciones propias
Declarar una excepción propia es muy
sencillo, lo que hay que hacer es primero
declarar una clase que herede de
Exception.
Luego en el método principal, lanzarla
en con ayuda de throw y throws, o
manejarla con ayuda de try - catch
40. Uso del throw en el catch
Uno puede usar un throw en un catch en vez
de manejar la excepción ahí mismo, en este
caso hay que tener en cunta que toca
también declararla usando en throws en la
declaración del método, y si existe un finally
este también se ejecuta.
Error de compilación, debe usarse un throws en la
declaración del método para solucionarse
41. EXCEPCIONES
COMUNES Y ERRORES2.6 Recognize situations that will result in any of the following
being thrown:
ArrayIndexOutOfBoundsException, ClassCastException, IllegalA
rgumentException, IllegalStateException, NullPointerException,
NumberFormatException, AssertionError, ExceptionInInitializerE
rror, StackOverflowError, or NoClassDefFoundError. Understand
which of these are thrown by the virtual machine and recognize
situations in which others should be thrown programmatically.
42. ¿De dónde vienen las
excepciones?
De acuerdo al objetivo de esta sección es
importante entender que causa una excepción o
un error y de donde estas son. Para el propósito
del examen vamos a definir dos categorías:
•Excepciones JVM: Estas excepciones y errores
son únicamente lanzados por el Java Virtual
Machine
•Excepciones de programación: Estas
excepciones y errores son exclusivamente
lanzadas por el desarrollados y el programa.
43. Excepciones JVM
NullPointerException: Esta excepción
se dispara cuando se trata de acceder
un objeto que no ha sido
inicializado, y que apunta a null.
Aquí hay un nullPointerException,
porque S sigue siendo Null, y un valor
null no puede indicar un tamaño
44. Excepciones JVM
StackOverFlowError: Es un error muy común
cuando hay un método recursivo, pero sobre
todo se presenta cuando se acaba la
memoria RAM para el procesamiento, java
no puede responde y sale esta excepción.
Esta recursividad se ejecutará tantas
veces que va a ocupar toda la memoria
RAM al final saldrá el error
StackOverFlowError
46. Lista de errores y
excepcionesExcepción Descripción Lazado por
ArrayIndexOutOfBound
sException
(Capítulo 3:
“Asignaciones”
Excepción que sale cuando se esta
tratando de entrar a una posición de un
array que no existe
JVM
ClassCastException
(Chapter 2, “Orientación
a objetos")
Excepción que ocurre cuando se esta
tratando de castear un objeto que no
cumple la regla “Es un”
JVM
IllegalArgumentExcepti
on(Este capítulo)
Se arroja cuando un método recibe un
argumento formateado de una forma
diferente a la que se espera
Program
ación
IllegalStateException
(Chapter 6, “Formato")
Lanzado cuando el estado del entorno no
esta óptimo para la operación que se trata
de hacer, por ejemplo una clase Scanner
que esta cerrada
Program
ación
NullPointerException
(Chapter 3,
"Assignments")
Lanzado cuando se trata de acceder un
objeto cuyo valor es nulo
JVM
47. Lista de errores y
excepciones
Excepción Descripción Lanzado por
NumberForma
tException
(Chapter 3,
"Assignments")
Esta excepción sale cuando el sistema recibe
un String y va a pasarlo a número pero el
valor no es posible convertirlo
Programación
AssertionError
(This chapter)
Se arroja cuando la evaluación de la sentencia
arroja false
Programación
ExceptionInIni
tializerError
(Chapter 3,
"Assignments")
Lanzado cuando se trata de inicializar una
variable estática o un bloque de inicialización
JVM
StackOverflow
Error
(This chapter)
Típicamente lanzado cuando los recursos de
la máquina están copados
JVM
NoClassDefFo
undError
(Chapter 10,
"Development")
Lanzada cuando java no encuentra una clase
que necesita, causada por un error en la línea
de comandos, la ruta del classpath o falta el
archivo .class
JVM
49. Aserciones
Las aserciones son mécanismos que usa java para poder hacer
validaciones en tiempo de desarrollo pero nunca en tiempo de
ejecución, sin necesidad de usar debug, excepciones o colocar líneas
de validación
Por ejemplo al usar una aserción con el fin de validar si un número es
negativo uno generalmente hace esto
Con las aserciones este código se ve reducido a esto:
Además otra ventaja que tiene es que si uno tiene la posibilidad de
deshabilitar las aserciones, por lo tanto se puede quitar la validación
sin necesidad de modificar el código
50. Funcionamiento de las
aserciones
La filosofía de las aserciones es muy
simple, deben estar evaluando una expresión, en
caso que la expresión sea verdadera pues no
hay lio en la ejecución, pero si es falsa entonces
arroja un AssertionError el cual no puede ser
controlado, por ser error.
Existen dos formas de programarlas
La diferencia consiste en que en el segundo caso, el mensaje que
está después de los dos puntos sale en la traza del error cuando
se arroja el AssertionError
51. Reglas de las aserciones
Las aserciones deben evaluar un booleano,
como un if y si imprime un valor debe ser un
String como un System.out.println
Formas válidas de Assert
Errores inválidas
52. La palabra assert y las versiones
de java
Resulta que las aserciones cambian
dependiendo de la versión de java en la
que se esté compilando, de tal forma
que si se usa una versión menor a 1.4 la
palabra assert puede servir para una
aserción o para identificar una
variable, ya de 1.4 en adelante es una
palabra reservada y no se podrá usar
para identificar variables
javac -source 1.3 OldCode.java P
javac -source 1.4 NotQuiteSoOldCode.java O
53. La palabra assert y las versiones
de java
El siguiente cuadro muestra el comportamiento dependiendo
de la versión de java con la que se esta compilando
54. Habilitando aserciones
Las aserciones por definición estan
deshabilitadas y si uno quiere que se
ejecuten entonces toca habilitarlas
manualmente.
Para habiliarlo toca en la consola
escribir lo siguiente
55. Deshabilitando aserciones
Las aserciones se pueden deshabiliar
de nuevo una vez estén activas, este
proceso es igual de sencillo que las
habilitaciones, para esto en la consola
se debe escribir algo así:
56. Activación selectiva de
aserciones
Hay tres modalidades de habilitar las
aserciones:
◦ Sin argumentos: Poner java –ea habilita las
aserciones en todas las clases de la aplicación
◦ Con el nombre de un paquete: Poner algo como
java -ea:com.foo... Habilita el paquete foo.
◦ Con una clase: Se habilita o se desabilita con
una clase en específico.
También existe la posibilidad de combinar
estas tres opciones, por ejemplo:
Aquí se puede ver que habilita todas clases
(parte azul), menos la clase Foo (parte roja)
58. Uso apropiado de las
aserciones
No es bueno validar parámetros de
entrada
◦ No es bueno simplemente porque en una
aplicación muy grande otras personas
pueden estar usando un método público,
al habilitarle y colocarle aserciones puede
afectar la ejecución de otro proceso
distinto al de uno, es recomendable
lanzar excepciones propias o
IllegalArgumentException.
59. Uso apropiado de las
asersiones
Validar si vienen valores en los
parámetros de entrada del main.
◦ En el main puede venir con parámetros de
entrada, al igual que el caso anterior es
mejor no validarlo con aserciones si no mejor
usar excepciones y control de variables.
No usar aserciones para validar casos
que en teoría se supone que nunca
sucederían
◦ Por lo general estos casos es mejor
controlarlos con una variable o una
excepción pues si se llegaran a disparar la
excepción no nos da suficiente información
de que fue lo que ocurrió
60. Uso apropiado de las
aserciones
No usar aserciones que puedan
ocasionar efectos colaterales
◦ Es mejor no usar métodos dentro de las
aserciones, pues recuerde que las
aserciones no siempre se ejecutan, solo
cuando están habilitadas, por lo tanto esto
puede generar inconvenientes para la
ejecución del programador
Lo más seguro es que
no siempre se ejecute
el método modifyThings
y esto puede generar
problemas para la ejecución
de la aplicación
62. Pregunta 1
Que es cierto:
A. Only one compilation will succeed
B. Exactly two compilations will succeed
C. Exactly three compilations will succeed
D. All four compilations will succeed
E. No compiler warnings will be produced
F. At least one compiler warning will be produced
Dado dos clases Y estas líneas de comando
63. Respuesta 1
Aquí hay que recordar que con java 3
e inferior la palabra asert no es
reservada y puede usarse como
identificador de variable, con 4 en
adelante es reservada y debe validar
una condición.
Por lo tanto
Dejando la opción B y F como válidas
P
O
O
P
64. Pregunta 2
Cuál es el resultado?
A. -
B. -c
C. -c2
D. -2c
E. -c22b
F. -2c2b
G. -2c2bc
H. Compilation fails
65. Respuesta 2
La respuesta
es –c, por la
tanto la opción
correcta es B
66. Pregunta 3
Dada la siguiente línea
try { int x = Integer.parseInt("two"); }
¿Cuál es el catch más apropiado?
A. ClassCastException
B. IllegalStateException
C. NumberFormatException
D. IllegalArgumentException
E. ExceptionInInitializerError
F. ArrayIndexOutOfBoundsException
67. Respuesta 3
ClassCastExcepction no es porque no se estan
casteando clases sino primitivas, entonces no es
la A.
IllegalStateStatement: Tampoco es porque no
estamos manejando variables estáticas
NumberFormatException: Si es, la conversión de
formatos primitivos númericos se debe validar
con esta excepción, la respuesta correcta es la
C.
IlegalArgumentException: No es un método, esta
opción se descarta
ExceptionInInicializater Error: Tampoco es un
error de inicialización.
ArrayIndexOfBoundsException: No hay arrays ni
arreglos en el código.
68. Pregunta 4
Qué es cierto?
A. It is appropriate to use assertions to
validate arguments to methods marked public
B. It is appropriate to catch and handle
assertion errors
C. It is NOT appropriate to use assertions to
validate command-line arguments
D. It is appropriate to use assertions to
generate alerts when you reach code that
should not be reachable
E. It is NOT appropriate for assertions to
change a program’s state
69. Respuesta 4
A es incorrecta, recuerde que es una
mala práctica validar variables de
entrada con aserciones en un método
público
B es incorrecta, no es apropiado
manejar errores
C es correcta, no es bueno validar
argumentos de la línea de entrada
D es correcta, es la funcionalidad básica
de una aserción.
E es correcta, no se debe usar una
aserción, si este genera un cambio en la
lógica del la aplicación.
70. Pregunta 5
¿Cuál opción insertada en la línea 4 funciona?
A. for(int y : x) {
B. for(x : int y) {
C. int y = 0; for(y : x) {
D. for(int y=0, z=0; z<x.length; z++) { y = x[z];
E. for(int y=0, int z=0; z<x.length; z++) { y =
x[z];
F. int y = 0; for(int z=0; z<x.length; z++) { y =
x[z];
71. Respuesta 5
A es una opción válida para un for
simplificado
B es incorrecta está mal declarada la
sentencia for
C es incorrecta, es obligatorio que y este
declarado dentro del for
D es correcta, es un for normal con
doble declaración
E es incorrecta porque esta mal
declarada z
F es correcta, es un for normal.
72. Pregunta 6
¿Cuál es el resultado?
A. -ic of
B. -mf of
C. -mc mf
D. -ic mf of
E. -ic mc mf of
F. -ic mc of mf
G. Compilation fails
74. Pregunta 7
What is the result? (Choose all that apply.)
A. Compilation succeeds
B. Compilation fails due to an error on line 8
C. Compilation fails due to an error on line 10
D. Compilation fails due to an error on line 12
E. Compilation fails due to an error on line 14
75. Respuesta 7
La A no es, existen problemas de
compilación
La B tampoco es pues la sobreescritura esta
bien, subsubexception es hija de
subexception.
La C si es, al tener que el método lanza
Exception se genera un error de
compilación, pues el thows solo permite que
sea la misma excepción o una hija
La D es incorrecta pues esta es una
sobrecarga y no hay problema por el throws
La E tampoco es pues un método sin throws
también es una forma válida de sobescritura
76. Pregunta 8
¿Cuál es el resultado?
A. 9 10 d
B. 8 9 10 d
C. 9 10 10 d
D. 9 10 10 d 13
E. 8 9 10 10 d 13
F. 8 9 10 9 10 10 d 13
G. Compilation fails