Download Las excepciones estándar - Iut

Document related concepts
no text concepts found
Transcript
Las excepciones estándar
Los programadores de cualquier lenguaje se esfuerzan por escribir programas libres de errores, sin
embargo, es muy difícil que los programas reales se vean libres de ellos. En Java las situaciones que
pueden provocar un fallo en el programa se denominan excepciones. Java lanza una excepción en
respuesta a una situación poco usual. El programador también puede lanzar sus propias excepciones.
Las excepciones en Java son objetos de clases derivadas de la clase base Exception. Existen también
los errores internos que son objetos de la clase Error que no estudiaremos. Ambas clases Error y
Exception son clases derivadas de la clase base Throwable. Existe toda una jerarquía de clases derivada
de la clase base Exception. Estas clases derivadas se ubican en dos grupos principales:
Las excepciones en tiempo de ejecución ocurren cuando el programador no ha tenido cuidado al
escribir su código. Por ejemplo, cuando se sobrepasa la dimensión de un array se lanza una excepción
ArrayIndexOutOfBounds. Cuando se hace uso de una referencia a un objeto que no ha sido creado se
lanza la excepción NullPointerException. Estas excepciones le indican al programador que tipos de
fallos tiene el programa y que debe arreglarlo antes de proseguir. El segundo grupo de excepciones, es
el más interesante, ya que indican que ha sucedido algo inesperado o fuera de control.
Captura de las excepciones
Empecemos por solucionar el error que se produce en el programa durante la compilación. Tal como
indica el mensaje que genera el compilador, se ha de poner la sentencia System.in.read(); en un bloque
try...catch, del siguiente modo.
try {
System.in.read();
}
catch (IOException ex)
{ }
Para solucionar el error que se produce en el programa durante su ejecución, se debe poner la llamada a
Integer.parseInt en el siguiente bloque try...catch.
String str="12";
int numero;
try{
numero=Integer.parseInt(str);
}
catch(NumberFormatException ex)
{
System.out.println("No es un número…");
}
En el caso de que el string str contenga caracteres no numéricos como es éste el caso, el número 12 está
acompañado de espacios en blanco, se produce una excepción del tipo NumberFormatException que es
capturada y se imprime el mensaje "No es un número". En vez de un mensaje propio se puede imprimir
el objeto ex de la clase NumberFormatException
try{
//...
}
catch(NumberFormatException ex)
{
System.out.println(ex);
}
La clase base Throwable de todas las clases que describen las excepciones, redefine la función toString,
que devuelve el nombre de la clase que describe la excepción acompañado del mensaje asociado, que
en este caso es el propio string str.
java.lang.NumberFormatException:
12
Podemos extraer dicho mensaje mediante la función miembro getMessage, del siguiente modo
try{
//...
}
catch(NumberFormatException ex)
{
System.out.println(ex.getMessage());
}
Si usted desea saber mas de las Exceptions en Java: revise la siguiente pagina:
http://mindprod.com/jgloss/exception.html
Manejando varias excepciones
Vamos a crear un programa que divida dos números. Supongamos que los números se introducen én
dos controles de edición. Se obtiene el texto de cada uno de los controles de edición que se guardan en
dos strings. En esta situación se pueden producir dos excepciones NumberFormatException, si se
introducen caracteres no numéricos y ArithmeticException si se divide entre cero.
public class ExcepcionApp
{
public static void main(String[] args)
{
String str1="12";
String str2="0";
String respuesta;
int numerador, denominador, cociente;
try{
numerador=Integer.parseInt(str1);
denominador=Integer.parseInt(str2);
cociente=numerador/denominador;
respuesta=String.valueOf(cociente);
}
catch(NumberFormatException ex)
{
respuesta="Se han introducido caracteres no numéricos";
}
catch(ArithmeticException ex)
{
respuesta="División entre cero";
}
System.out.println(respuesta);
}
}
Como vemos las sentencias susceptibles de lanzar una excepción se sitúan en un bloque try...catch. Si
el denominador es cero, se produce una excepción de la clase ArithmeticException en la expresión que
halla el cociente, que es inmediatamente capturada en el bloque catch que maneja dicha excepción,
ejecutándose las sentencias que hay en dicho bloque. En este caso se guarda en el string respuesta el
texto "División entre cero". Hay veces en las que se desea estar seguro de que un bloque de código se
ejecute se produzcan o no excepciones. Se puede hacer esto añadiendo un bloque finally después del
último catch. Esto es importante cuando accedemos a archivos, para asegurar que se cerrará siempre un
archivo se produzca o no un error en el proceso de lectura/escritura.
try{
//Este código puede generar una excepción
}
catch(Exception ex)
{
//Este código se ejecuta cuando se produce una excepción
}
Finally
{
//Este código se ejecuta se produzca o no una excepción
}
Lectura por teclado en JAVA
El siguiente ejemplo, es una sección de código que permite (de una manera sencilla) leer el nombre de
una persona por teclado y mostrarlo por consola.
import java.io.*;
class lectura
{
public static void main(String[]args)throws IOException
{
BufferedReader T = new BufferedReader(new InputStreamReader(System.in));
String nombre;
System.out.println("Ingrese su nombre: ");
nombre = T.readLine();
System.out.println("Bienvenido " + nombre);
}
}
En java para poder escribir se emplea el objeto System.out, pero para leer del teclado es necesario
emplear System.in. Este objeto pertenece a la clase InputStream, esto significa que para leer tenemos
que emplear sus métodos, el más básico es read, que permite leer un carácter:
char caracter = (char) System.in.read();
Pero como podemos comprobar es muy incómodo leer de letra en letra, por ello para poder leer una
línea completa emplearemos el siguiente código:
BufferedReader lectura = new BufferedReader(new InputStreamReader(System.in));
En el cuál creamos un InputStreamReader a partir de System.in y pasamos dicho InputStreamReader al
constructor de BufferedReader, el resultado es que las lecturas que hagamos sobre lectura son en
realidad realizadas sobre System.in, pero con la ventaja de que se permite leer una línea completa.
Es necesario realizar un import de java.io para poder emplear esta lectura de líneas.
PROGRAMA LECTURA DE NÚMEROS POR TECLADO EN JAVA:
import java.io.*;
class lectura
{
public static void main(String[]args)throws IOException
{
BufferedReader T = new BufferedReader(new InputStreamReader(System.in));
int num;
System.out.println("Ingrese numero: ");
num = Integer.parseInt(lectura.readLine());
System.out.println("su numero es " + num);
}
}
Integer : Clase estándar que no necesita ser instanciada (está disponible por defecto).
parseInt : Método que convierte un string (cadena de caracteres) en un dato numérico de tipo int.
Este método pertenece a la clase de Java Integer.
y un ultimo ejemplo:
import java.io.*;
public class ejercicio {
public static void main(String[] args)throws IOException {
BufferedReader T = new BufferedReader(new InputStreamReader(System.in));
String nombre, apellido;
int edad;
System.out.println("Ingrese su nombre:");
nombre = T.readLine();
System.out.println("Ingrese su apellido:");
apellido = T.readLine();
System.out.println("Ingrese su edad:");
edad = Integer.parseInt(T.readLine());
System.out.println("Su nombre Completo es: " + nombre + apellido);
System.out.println("Su edad es:"+edad);
if (edad >=18)
{System.out.println("Usted es mayor de edad");}
else
{System.out.println("Usted no es mayor de edad");}
}
}