Excepciones (Exception) en Java, con ejemplos


En Java los errores en tiempo de ejecución (cuando se esta ejecutando el programa) se denominan excepciones, y esto ocurre cuando se produce un error en alguna de las instrucciones de nuestro programa, como por ejemplo cuando se hace una división entre cero,  cuando un objeto es 'null' y no puede serlo, cuando no se abre correctamente un fichero, etc. Cuando se produce una excepción se muestra en la pantalla un mensaje de error y finaliza la ejecución del programa.

En Java (al igual que en otros lenguajes de programación), existen mucho tipos de excepciones y enumerar cada uno de ellos seria casi una labor infinita. En lo referente a las excepciones hay que decir que se aprenden a base experiencia, de encontrarte con ellas y de saber solucionarlas.

Cuando en Java se produce una excepción se crear un objeto de una determina clase (dependiendo del tipo de error que se haya producido), que mantendrá la información sobre el error producido y nos proporcionará los métodos necesarios para obtener dicha información. Estas clases tienen como clase padre la clase Throwable, por tanto se mantiene una jerarquía en las excepciones. A continuación mostramos algunas de las clases para que nos hagamos una idea de la jerarquía que siguen las excepciones, pero existen muchísimas más excepciones que las que mostramos:

Exception_jarroba_diagramClass

A continuación vamos a mostrar un ejemplo de como al hacer una división entre cero, se produce una excepción. Veamos la siguiente imagen en el que podemos ver un fragmento de código y el resultado de la ejecución del código:

Exception_1_java_jarroba

Como vemos en nuestro programa tenemos 3 instrucciones. La primera debe de imprimir por pantalla el mensaje "ANTES DE HACER LA DIVISIÓN", la segunda debe de hacer la división y la última debe de imprimir por pantalla el mensaje "DESPUES DE HACER LA DIVISIÓN". La primera instrucción la ejecuta perfectamente, pero al llegar a la segunda se produce una "ArithmeticException" (excepción de la clase ArithmeticException) y se detiene la ejecución del programa ya que estamos dividiendo un número entre '0'.

Por suerte Java nos permite hacer un control de las excepciones para que nuestro programa no se pare inesperadamente y aunque se produzca una excepción, nuestro programa siga su ejecución. Para ello tenemos la estructura "try – catch – finally" que la mostramos a continuación:

try {

	// Instrucciones cuando no hay una excepción

} catch (TypeException ex) {

	// Instrucciones cuando se produce una excepcion

} finally {

	// Instruciones que se ejecutan, tanto si hay como sino hay excepciones

}

Respecto a la estructura "try – catch – finally", se ha de decir que primero se ejecuta el bloque "try", si se produce una excepción se ejecuta el bloque "catch" y por último el bloque "finally". En esta estructura se puede omitir el bloque "catch" o el bloque "finally", pero no ambos.

Sabiendo esta estructura, podemos reescribir nuestro programa para que se ejecuten las tres instrucciones aunque se produzca una excepción. Previamente debemos de saber cual va a ser la clase de la excepción que puede aparecer que seria la "ArithmeticException" para definirla en la parte del "catch". Nuestro programa quedaría de la siguiente forma y se ejecutaría sin problema obteniendo también la información de la excepción:

Exception_2_java_jarroba

Como vemos capturamos la excepción en un objeto "ex" de la clase "ArithmeticException" y podemos obtener el mensaje de error que nos da la excepción. Vemos también que el programa termina su ejecución aunque se haya producido una excepción.

Dentro de una misma estructura podemos definir todas las excepciones que queramos. En el caso anterior hemos definido solo la excepción "ArithmeticException"; pero por ejemplo, podemos definir también la excepción "NullPointerException", por si nos viene un valor a 'null' al hacer la división:

 Exception_3_java_jarroba

En resumen, hemos puesto en esta entrada un ejemplo muy sencillo para controlar un par de excepciones bastante obvias como la división entre '0' y un 'null', que perfectamente lo podríamos haber controlado con una sentencia de control "if" mirando el contenido de los atributos, pero la finalidad de esta entrada era ver como controlar las excepciones con la estructura "try – catch – finally", que si lo sabemos utilizar nuestro programa deberá seguir funcionando aunque se produzcan excepciones. Decir también que es casi imposible aprenderse todas las excepciones que hay en Java (así que no os pongáis a empollarlas una a una porque igual no utilizareis ni el 10% de las que hay) ya que estas las iréis aprendiendo según os las vayáis encontrando en vuestros desarrollos. Estas que os hemos mostrados son bastante comunes al igual que las que os podéis encontrar con el tratamiento de ficheros, de arrays, etc.

Comparte esta entrada en:
Safe Creative #1401310112503
Excepciones (Exception) en Java, con ejemplos por "www.jarroba.com" esta bajo una licencia Creative Commons
Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.
Creado a partir de la obra en www.jarroba.com

43 thoughts on “Excepciones (Exception) en Java, con ejemplos”

  1. Por favor su ayuda con este ejercicio

    Realizar un programa que contenga una excepción propia, es decir, creada por usted. La excepción será de tipo Checked.

    Crear una clase con el método main y un método adicional que arroje la excepción propia creada. El método debe ser validarCorreo que recibe como parámetro una cadena de texto.

    La validación del correo puede investigar en Internet o realizar usted mismo la lógica. Parte de una buena calificación de este deber es justamente esta validación.

    Este método se debe llamar desde el método main, y controlar con try-catch la excepción.

    Debe utilizar las convenciones de Java. Nombres de clase, métodos, variables, indentación y llaves.

  2. Tengo que hacer esto, pero tengo un problema. El log(-1)=NaN no se a que error debo atrapar; yo hice esto, pero me da error:,(
    Escribir el código de una clase para tratar el error que se produce cuando el argumento de un logaritmo neperiano es negativo; el constructor de la clase debe tener como argumento una cadena y el valor que ha generado el error. Escribir un programa Java en el que se genere la excepción anterior y sea capturada.

    public class LogaritmoExc  extends Exception{
        private String cadena;
        private double valor;
        public LogaritmoExc(String cadena, double valor) {
                    super(cadena );
                    valor=valor;    }  
    }
    public class main{    public static void main(String[] args) throws LogaritmoExc {
            double n1,result;
            Scanner sc = new Scanner(System.in);
            System.out.println("Ingrese logaritmo de: ");
             n1 = sc.nextDouble();
              result= Math.log(n1);
              throw new LogaritmoExc("Ingrese un valor >0", n1);
        }
    }
    }
    
    1. Quizás te esté devolviendo un número complejo y no lo pueda expresar, una solución sería probar con BigDecimal por si no cupiera (convertir n1 a BigDecimal).

      Por otro lado, quizás te valga con evitar los números no deseados y lanzar tú mismo el error:

      if (n1 <= 0 ) {
          throw new ArithmeticException("No se pueden procesar números negativos ni cero");
      }
      
      1. Tengo la misma tarea de «lisstalik» no sé cómo hacerla no sale, por favor me pueden ayudar con ese ejercicio.
        EJERCICIO:
        Escribir el código de una clase para tratar el error que se produce cuando el argumento de un logaritmo neperiano es negativo; el constructor de la clase debe tener como argumento una cadena y el valor que ha generado el error. Escribir un programa
        Java en el que se genere la excepción anterior y sea capturada.

  3. Hola me podriian ayudar a ponerle dos excepciones a mi programa:
    1.- Una excepcion en caso de encontrarse con una division entre cero.
    2.- Una excepcion que indique cuando se estan inroduciendo valores no numericos.
    public class porcentaje {
    public double cantidad;
    public double porciento;
    public double resultado;

    public void calcularPorcentaje(double porcent, double cant) {
    resultado = (porcent / 100) * cant;
    System.out.println(«El » + porcent + «% de » + cant + » es: » + resultado);
    }
    }

    public class calcularPorcentaje {

    public static void main(String[] args) {
    porcentaje obj01 = new porcentaje();
    System.out.print(«CALCULAR PORCENTAJE\n»);
    obj01.calcularPorcentaje(30, 32000);
    }

    }

    1. Buenas Aylin.
      Lo que necesitas es lanzar excepciones para todos tus casos.
      Por ejemplo, en el de la división por cero puedes comprobar que el denominador sea cero y lanzar una excepción con:

      throw new Exception("El denominador es cero");
  4. hola, podrias ayudarme a modificar y mejorar este programa porfavor;

    package divZero;
    import java.util.Scanner;
    public class DivZeroExcepcion {
    public static void main(String[] args) {
    Scanner teclado = new Scanner (System.in);
    int numerador = 100;
    int denominador, cociente;

    // Valida la division por Cero, la entrada de un Caracter, un
    valor fraccionario en un entero
    // o bien desbordamiento del tipo o cadena vacia…
    try
    {
    System.out.println(«\nPrimer Bloque try»);
    System.out.println(«Capture el valor del denominador:»);
    denominador = teclado.nextInt();
    cociente = numerador / denominador;
    System.out.println («Resultado de la division es = «+ cociente);
    }
    catch (ArithmeticException e)
    {
    System.out.println(«Bloque catch»);
    System.out.println(«Excepcion aritmética»);
    System.out.println(«ArithmeticException Handler: «+
    e.toString());
    System.out.println(«\nNo se puede dividir por 0\n»);
    }
    catch (Exception e)
    {
    System.out.println(«Ultimo Bloque catch»);
    System.out.println(«Error…. Posible Desbordamiento de
    pila…generic Handler: «+ e.toString());
    }
    finally
    {
    System.out.println(«\nSalir con Bloque finally»);
    }
    teclado.close();
    }
    }

    1. No entiendo muy bien lo que necesitas.
      En try se pone el código «peligroso» que pueda devolver erorres que queramos capturar.
      Si acaso puedes poner el close en el finally, el resto depende, no lo veo mal.

  5. alguien que me pueda ayudar hacer este ejercicio
    Diseña e implementa una clase Fraccion que permite crear fracciones (numerador y denominador enteros), con métodos para sumar, restar, multiplicar y dividirlas.
    Crea una excepción FraccionException que se lance siempre que en una operación de fracción se produzca un error, a saber:
    Creación de una fracción con denominador cero.
    División de una fracción entre otra con numerador cero.
    Cualquier operación que incluya una fracción con denominador cero.
    Hacer que cada operación crítica lance esta excepción si se produce, con un mensaje indicativo del tipo de error.

    1. Buenas Herminia.
      Ejercicios no hacemos, no es ético. Pero podemos darte pistas para que lo puedas realizar.
      Necesitas crear una clase con el error nuevo FraccionException, luego recoger los errores de la fracción cada vez que haya algún error y lanzar tu nueva excepción.

        1. Egoísta sería si les hiciéramos los ejercicios a unos pocos alumnos de la clase, aprobaran sin aprender quienes no se lo merecen, por lo que no aprenderían y, por tanto, su futuro laboral se le complicaría de este modo 😉

          1. hola que tal yo necesito ayuda pues estoy estudiando programacion pero no entiendo me pueden ayudar dando explicaciones en el programa java.

    2. clave para que te ayuden a resolverlo y no te salgan con boludeses de si es moral o no. Lleva hecho alguna parte del codigo, traelo aqui a comentarios y te diran que te falta 😀
      te ayudaria pero no tengo idea de como hacer lo que piden jajaj

  6. Hola!
    Me gustaría que hicierais una segunda parte de excepciones en la cual podríais hablar del checked, del uncheked, del getCause(), de si una excepción puede tener constructores… Esas cositas!
    Me sería realmente útil ya que es lo que estoy estudiando ahora mismo y en las clases online me cuesta mucho entenderlo, sin embargo siempre que leo tus entradas entiendo todo.
    Muchísimas gracias por tu trabajo y por tu dedicación.
    Un saludo!

  7. Para el caso en el que se usan sockets, por ejemplo si ya se tiene una conexión establecida entre dos dispositivos, y se está enviando información de un dispositivo a otro de manera continua. Cuando ya no puedan enviarse información por ejemplo debido a la distancia, ¿saltaría una excepción al momento debida al socket o seguiría intentando enviar información y la excepción no aparecería al momento?¿ o esta exepción saltaría más bien por el «send» o el «write»?

    Mi intención es calcular la ubicación de un dispositivo justo cuando falla esa conexión(tecnología Wifi Direct).

    Gracias.

        1. Si controlas la excepción puedes reanudar desde ahí el código. Si quieres hacer algo más complejo, podrías crear un bucle que reintente hasta que no de error, re-ejecutándose el código que falló (muy útil para redes; recomendable aplicar un backoff exponencial para la espera entre re-ejecuciones https://en.wikipedia.org/wiki/Exponential_backoff). Algo así en pseudo código:

          Boolean rejecutar = true;

          while (reejecutar){
          reejecutar = false;
          try{
          // Código que podría devolver una excepción
          }catch{
          rejecutar = true;
          }
          }

  8. Buenas disculpe tengo una duda como se llama la exception que tendria que colocar en el catch cuando el campo de un JOptionPane.ShowInputDiag esta vacio?

  9. buenas como seria un programa para que solo acepte texto y cuando de introdusca un numero salga un mensaje de error.

    1. Podrías utilizar una expresión regular como:

      contieneSoloLetras = textoSoloLetrasPermitidas.matches(«[a-zA-Z]*»)

  10. Hola, porsiacaso hay un mapeo de los exceptions ?? , necesito ver un exception generico para base de datos.. gracias

  11. hola, como hago un try catch, cuando el menu es  

    System.out.println(" Menu de opciones")

     System.out.println("1. inscribir materia (recuerde que debe registrar primero profesor)");             System.out.println("2. inscribir profesor");             System.out.println("3. inscribir estudiante");             System.out.println("4. Calificar.");             System.out.println("5. mostrar todos los registros profesores / estudiantes/ notas");             System.out.print("Digite su opción:"); y lo leo así  switch (scanf.nextInt()) ayuda ?

    1. mejor utiliza BufferedReader

      BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

      String alternativa;

      try{

      do{

      System.out.println("ingresa cliente s/n: ");

      alternativa = bf.readLine();

      if(alternativa.equalsIgnoreCase("s")){

      System.out.println("ingrese nombre: ");

      String nombre = bf.readLine();

      ……y asi…

      }

      }while(alternativa.equalsIgnoreCase("s"))

      }catch(){

      e.printStackTrace();

      e.getMessage();

      }

  12. Tengo esta Clase 

    import java.util.Scanner;

    public class Teclado{

        private static Scanner sc;
        

        
        public static int leerEntero()
        {
            sc = new Scanner( System.in );  
            return sc.nextInt();
        }

        
        public static float leerFlotante()
        {
            sc = new Scanner( System.in );
            return sc.nextFloat();
        }

        public static double leerDoble()
        {
            sc = new Scanner( System.in );
            return sc.nextDouble();
        }

        
        public static String leerCadena()
        {
            sc = new Scanner( System.in );
            return sc.nextLine();
        }

        public static char leerCaracter()
        {
            sc = new Scanner( System.in );
            return sc.next().charAt( 0 );  
        }

     

    como hago las excepciones para que si en ves de poner un numero pone una letra aparezca un msj de "introduce un numero" y viceversa ??

    porfa ayudenme 

    apenas comienzo a aprender 

    y diseñe esta clase teclado para usarla en todas mis apps por el momento

    1. Cuando detectes que la entrada no es válida simplemente throw, como por ejemplo:

      if (es_entrada_no_valida){

      throw new Exception();

      }

  13. Buenas tardes

    Se se teclea un número pero era una letra, cuál sería la excepción que debo poner en el catch?

  14. Gracias por el ejemplo, me ha servido de mucho. Me podrias ayudar con un problema? si por error tecleo una letra en lugar de un número, sabes cuál sería la excepción que debo poner en el catch?

    1. Hola Elsa.

      Esa excepción se hace con «NumberFormatException», que lo que hace es que sino es un número te lanza una excepción.

      SL2

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies

ACEPTAR
Aviso de cookies