| Creación de un Televisor estándar |
| Paso 19: Operativa |
La aplicación del Televisor lanza excepciones
Cuando empezamos a desarrollar aplicaciones Java durante bastante tiempo sólo haremos uso de las excepciones creadas por las APIs de Java. Más adelante al adquirir experiencia desarrollando aplicaciones Java y tengamos que crear librerias de bajo nivel, será cuando tengamos la necesidad de crear nuestras propias excepciones.
Vamos a crear una Clase llamada CanalNegativoException en el paquete paqtvestandar que va a heredar de la Clase Exception
Este es el código de la Clase CanalNegativoException
package paqtvestandar;
public class CanalNegativoException extends Exception {
private int detalle;
public CanalNegativoException() {
}
public CanalNegativoException(int detalle) {
this.detalle = detalle;
}
public String toString() {
return "EL VALOR DEL CANAL " + detalle + " NO ES ACEPTADO";
}
} |
- public class CanalNegativoException extends Exception {
- para que la Clase CanalNegativoException tenga rango de excepción, ésta tiene que heredar de la Clase Exception
- private int detalle;
- si queremos transmitir información concreta por la cual se ha producido una excepción, entonces nos creamos la varible de instancia detalle
- de esta forma podremos mostrar posteriormente el valor erróneo que el usuario ha introducido
- public CanalNegativoException(int detalle) {
this.detalle = detalle;
}
- sobrecargamos el Constructor para poder coger el valor negativo que ha introducido el usuario
- public String toString() {
return "EL VALOR DEL CANAL " + detalle + " NO ES ACEPTADO";
}
- el método toString() ya existe en la Clase Throwable, y en este caso nosotros lo sobreescribimos para dar información sobre la excepción que se ha producido
Ahora vamos a modificar el código de las Clases Televisor, TelevisorVirtual y TeleRadioVirtual para que puedan cada una de ellas delegar la excepción CanalNegativoException en caso de que el usuario en la Clase Aplicación al querer crear una instancia de tipo TeleRadioVirtual le pasara un entero negativo al Constructor de la mencionada Clase
Vamos a empezar por la Clase Televisor
package paqtvestandar;
public abstract class Televisor {
private int canal;
private int volumen = 5;
public Televisor() {}
public Televisor(int canal) throws CanalNegativoException {
setCanal(canal);
}
public void subirCanal() throws CanalNegativoException {
setCanal(canal + 1);
}
public void bajarCanal() throws CanalNegativoException {
setCanal(canal - 1);
}
public int getCanal() {
return canal;
}
public void setCanal(int canal) throws CanalNegativoException {
if (canal < 0){
// this.canal = 0;
throw new CanalNegativoException(canal);
}
else {
this.canal = canal;
}
}
public void subirColor(){
System.out.println("Televisor - subirColor(): estoy subiendo el color");
subirColorAyuda();
}
protected void subirColorAyuda() {
System.out.println("Televisor - subirColorAyuda(): sigo subiendo el color");
}
public void bajarColor(){
System.out.println("Televisor - subirColor(): estoy bajando el color");
bajarColorAyuda();
}
protected void bajarColorAyuda() {
System.out.println("Televisor - bajarColorAyuda(): sigo bajando el color");
}
public void subirVolumen() {
volumen = volumen + 1;
}
public void bajarVolumen() {
volumen = volumen - 1;
}
public int getVolumen() {
return volumen;
}
public abstract void usarMenu();
public final void encender(){
System.out.println("Televisor - encender(): estoy encendiendo el televisor");
}
public final void apagar(){
System.out.println("Televisor - apagar(): estoy apagando el televisor");
}
} |
- public void setCanal(int canal) throws CanalNegativoException {
if (canal < 0){
// this.canal = 0;
throw new CanalNegativoException(canal);
- la sentencia throw se utiliza cuando se crea una excepción y la lanza para que algún bloque try/catch la pueda tratar
- el método setCanal(...) se desentiende de esta excepción y la lanza con la sentencia throws CanalNegativoException al origen de la llamada
- en este caso el origen de la llamada es el Constructor de la Clase Televisor
- public Televisor(int canal) throws CanalNegativoException {
setCanal(valorCanal);
}
- el Constructor invoca el método setCanal(...)
- el Constructor también se desentiende de la excepción y la lanza al origen de la llamada
- en este caso el origen de la llamada es el Constructor de la Clase TelevisorVirtual
Compilamos la Clase Televisor.
Este es el código ampliado de la Clase TelevisorVirtual
package paqtvestandar;
public class TelevisorVirtual extends Televisor {
private boolean sonido = true;
public TelevisorVirtual() {}
public TelevisorVirtual(int valorCanal) throws CanalNegativoException {
super(valorCanal);
}
public void setSonido(boolean valorSonido){
sonido = valorSonido;
}
public boolean isSonido(){
return sonido;
}
public void subirVolumen() {
super.subirVolumen();
if (this.isSonido() == false){
setSonido(true);
}
}
public void bajarVolumen() {
super.bajarVolumen();
if (isSonido() == false){
setSonido(true);
}
}
public void usarMenu(){
System.out.println("TelevisorVirtual - usarMenu(): utilizo el menu");
}
} |
- public TelevisorVirtual(int valorCanal) throws CanalNegativoException {
super(valorCanal);
}
- el Constructor se desentiende de la excepción y la lanza al origen de la llamada
- en este caso el origen de la llamada es el Constructor de la Clase TeleRadioVirtual
Compilamos la Clase TelevisorVirtual.
Este es el código ampliado de la Clase TeleRadioVirtual
package paqtvestandar;
public final class TeleRadioVirutal extends TelevisorVirtual implements IRadio {
private int banda = FM;
private double emisora = 95.6;
public TeleRadioVirtual() {}
public TeleRadioVirtual(int canal) throws CanalNegativoException {
super(canal);
}
public void setBanda(int banda) {
if ((banda == AM) || (banda == FM)){
this.banda = banda;
}
else {
this.banda = FM;
}
}
public String getBanda() {
return banda;
}
public void setEmisora(double emisora) {
this.emisora = emisora;
}
public double getEmisora(){
return emisora;
}
public void siguienteEmisora() {
System.out.println("TeleRadioVirtual - siguienteEmisora(): pasamos a " +
"la siguiente emisora");
}
public void emisoraAnterior() {
System.out.println("TeleRadioVirtual - siguienteEmisora(): pasamos a " +
"la emisora anterior");
}
public void ajustarAntena() {
// esta radio tiene una antena interna que no se puede ajustar
}
} |
- public TeleRadioVirtual(int valorCanal) throws CanalNegativoException {
super(valorCanal);
}
- el Constructor se desentiende de la excepción y la lanza al origen de la llamada
- en este caso el origen de la llamada es al método main(...) de la Clase AplicacionConExcepcionToString
Compilamos la Clase TeleRadioVirtual.
Ahora vamos a crear la Clase AplicacionConExcepcionToString y vamos a crear una instancia de TeleRadioVirtual con un valor de canal correcto. En este caso el canal 8.
Este es el código de la Clase AplicacionConExcepcionToString
package paqtvestandar;
public class AplicacionConExcepcionToString {
public static void main(String[] args) {
try {
TeleRadioVirtual tv = new TeleRadioVirtual(8);
tv.encender();
System.out.println("El canal seleccionado es el: " + tv.getCanal());
tv.setCanal(3);
System.out.println("El canal seleccionado es el: " + tv.getCanal());
tv.subirColor();
tv.setSonido(false);
System.out.println("El televisor tiene el sonido: " + tv.isSonido());
tv.subirVolumen();
System.out.println("La posición del volumen es: " + tv.getVolumen());
System.out.println("El televisor tiene el sonido: " + tv.isSonido());
tv.usarMenu();
System.out.println("La radio tiene la banda: " + tv.getBanda());
System.out.println("La radio tiene la emisora: " + tv.getEmisora());
tv.siguienteEmisora();
System.out.println("La radio tiene la banda: " + tv.getBanda());
tv.setBanda(TeleRadioVirtual.AM);
System.out.println("La radio tiene la banda: " + tv.getBanda());
tv.apagar();
} catch (CanalNegativoException cne) {
System.out.println(cne.toString());
}
}
} |
- try {
.
.
.
} catch (CanalNegativoException cne) {
System.out.println(cne.toString());
}
- la Clase Aplicacion finalmente trata la excepción
- esto es así, por que la Clase AplicacionConExcepcionToString representa el código de alto nivel escrito especialmente para un usuario concreto al cual le tenemos que indicar en su contexto de la mejor forma posible el motivo de la excepcion
- las excepción no se pueden tratar en un nivel de Clases de bajo nivel reutilizables porque en dicho nivel desconocemos el perfil del usuario que va a tener que recibir el mensaje de la excepción
Esta es la salida que cabe esperar al ejecutar la Clase AplicacionConExcepcionToString

Ahora le vamos a pasar al Constructor de la Clase TeleRadioVirtual el canal -5.
Seguidamente ejecutamos la Clase AplicacionConExcepcionToString y comprobamos como el entorno de ejecución Java no ha permitido que se cree un Objeto de tipo TeleRadioVirtual con un valor de canal negativo

Ahora vamos a crear la Clase AplicacionConExcepcionPrintStackTrace y vamos a crear una instancia de TeleRadioVirtual con un valor de canal correcto. En este caso el canal 8.
Este es el código de la Clase AplicacionConExcepcionPrintStackTrace
package paqtvestandar;
public class AplicacionConExcepcionPrintStackTrace {
public static void main(String[] args) {
try {
TeleRadioVirtual tv = new TeleRadioVirtual(8);
tv.encender();
System.out.println("El canal seleccionado es el: " + tv.getCanal());
tv.setCanal(3);
System.out.println("El canal seleccionado es el: " + tv.getCanal());
tv.subirColor();
tv.setSonido(false);
System.out.println("El televisor tiene el sonido: " + tv.isSonido());
tv.subirVolumen();
System.out.println("La posición del volumen es: " + tv.getVolumen());
System.out.println("El televisor tiene el sonido: " + tv.isSonido());
tv.usarMenu();
System.out.println("La radio tiene la banda: " + tv.getBanda());
System.out.println("La radio tiene la emisora: " + tv.getEmisora());
tv.siguienteEmisora();
System.out.println("La radio tiene la banda: " + tv.getBanda());
tv.setBanda(TeleRadioVirtual.AM);
System.out.println("La radio tiene la banda: " + tv.getBanda());
tv.apagar();
} catch (CanalNegativoException cne) {
cne.printStackTrace();
}
}
} |
- try {
.
.
.
} catch (CanalNegativoException cne) {
cne.printStackTrace();
}
- la Clase Aplicacion finalmente trata la excepción
- esto es así, por que la ClaseAplicacionConExcepcionPrintStackTracerepresenta el código de alto nivel escrito especialmente para un usuario concreto al cual le tenemos que indicar en su contexto de la mejor forma posible el motivo de la excepcion
- las excepción no se pueden tratar en un nivel de Clases de bajo nivel reutilizables porque en dicho nivel desconocemos el perfil del usuario que va a tener que recibir el mensaje de la excepción
Esta es la salida que cabe esperar al ejecutar la Clase AplicacionConExcepcionPrintStackTrace

Ahora le vamos a pasar al Constructor de la Clase TeleRadioVirtual el canal -5.
Seguidamente ejecutamos la Clase AplicacionConExcepcionPrintStackTrace y comprobamos como el entorno de ejecución Java no ha permitido que se cree un Objeto de tipo TeleRadioVirtual con un valor de canal negativo

- como podemos ver la invocación al método printStackTrace()ha provocado lo que el nombre del método indica
- una impresión del trazado de la pila
- la salida del método printStackTrace()puede ser muy útil si se redirige a un fichero de tipo log para que los desarrolladores en caso de ocurrir una excepción podamos hacer un seguimiento del programa desde el punto donde se origió el error hasta el punto donde se trató el mencionado error