Reconociendo tipos de excepciones comunes

Anuncio
Reconociendo tipos de excepciones comunes
Es necesario reconocer tres tipos de excepciones para el examen de OCA : excepciones
de tiempo de ejecución ,
excepciones comprobadas , y los errores . Veremos ejemplos comunes de cada tipo .
Para el
examen, se tendrá que reconocer el tipo de una excepción que es y si se ha tirado por
la JVM o un programador . Para que pueda reconocerlos , le mostraremos algunos
ejemplos de código
para esas excepciones .
Runtime Exceptions
Excepciones de tiempo de ejecución se extienden RuntimeException . No tienen que ser
manejado o declarado.
Ellos pueden ser lanzados por el programador o por la JVM . excepciones de tiempo de
ejecución común
Incluya lo siguiente:
ArithmeticException lanzada por la JVM cuando el código intenta dividir por cero
ArrayIndexOutOfBoundsException Lanzado por la JVM cuando el código utiliza un
ilegal índice para acceder a una matriz
ClassCastException Lanzado por la JVM cuando se hace un intento de lanzar una
excepción a una subclase de la que no es una instancia
IllegalArgumentException Lanzado por el programador para indicar que un método tiene
ha pasado un argumento ilegal o inapropiado
NullPointerException lanzada por la JVM cuando hay una referencia nula cuando una
Se requiere de objetos
NumberFormatException Lanzado por el programador cuando se hace un intento para
convertir una cadena a un tipo numérico pero la cadena no tiene un formato apropiado
ArithmeticException
Tratar de dividir un entero por cero da un resultado definido undefi . Cuando esto ocurre ,
la JVM
lanzar una ArithmeticException :
int answer = 11 / 0 ;
Al ejecutar este código da como resultado el siguiente resultado :
Excepción en el hilo java.lang.ArithmeticException " principal " : / por cero
Java no explican la palabra "brecha ". Eso está bien , sin embargo, porque sabemos que /
es
el operador de división y que Java está tratando de decirnos la división por cero se
produjo .
El hilo " principal " nos dice el código se llama directa o indirectamente de un programa de
con un método principal. En el examen OCA , todo esto es la salida veremos . A
continuación viene la
nombre de la excepción , seguido de información adicional ( si lo hay) que va con la
excepción .
ArrayIndexOutOfBoundsException
Ahora ya sabes que los índices de matrices comienzan con el número 0 y hasta 1 menor
que la longitud de la
matriz de lo que significa este código generará un ArrayIndexOutOfBoundsException :
int[] countsOfMoose = new int[3];
System.out.println(countsOfMoose[-1]);
Esto es un problema porque no hay tal cosa como un índice de la matriz negativa. la
ejecución de este
código da el siguiente resultado :
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
Al menos Java nos dice lo que el índice no es válido. ¿Se puede ver lo que está mal con
éste ?
int total = 0;
int[] countsOfMoose = new int[3];
for (int i = 0; i <= countsOfMoose.length; i++)
total += countsOfMoose[i];
El problema es que el bucle debe tener < en lugar de < = . En la iteración final de
el bucle , Java intenta llamar countsOfMoose [ 3 ], que no es válido. La matriz incluye
solamente
tres elementos , por lo que el mayor índice de 2 posible . La salida es el siguiente :
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
ClassCastException
Java intenta protegerle de moldes imposibles . Este código no se compila porque Entero
No es una subclase de la secuencia:
String type = "moose";
Integer number = (Integer) type; // DOES NOT COMPILE
código más complicado frustra los intentos de Java para protegerle . Cuando la
conversión falla en
tiempo de ejecución , Java arrojará un ClassCastException :
String type = "moose";
Object obj = type;
Integer number = (Integer) obj;
El compilador ve un reparto del objeto a entero . Esto podría estar bien. El compilador
no se dan cuenta de que hay una cadena en ese objeto. Cuando se ejecuta el código , se
obtiene la siguiente
salida:
Exception in thread "main" java.lang.ClassCastException: java.lang.String
cannot be cast to java.lang.Integer
Java nos dice dos tipos que estuvieron involucrados en el problema , por lo que es
evidente lo que hay incorrecto.
IllegalArgumentException
IllegalArgumentException es una manera para que su programa para protegerse a sí
misma . Primero se vio la
siguiente método de selección de la clase cisne en el Capítulo 4 , "Métodos y
encapsulación . "
6: public void setNumberEggs(int numberEggs) {// setter
7: if (numberEggs >= 0) // guard condition
8: this.numberEggs = numberEggs;
9: }
Este código funciona , pero que realmente no quiere hacer caso omiso de la petición de la
persona que llama cuando dicen
nosotros tiene un cisne -2 huevos. Queremos decirle a la persona que llama que algo está
mal , de preferencia en una
manera muy obvio que la persona que llama no puede ignorar de manera que el
programador fi jar el problema .
Las excepciones son una manera efi ciente para hacer esto. Al ver el final de código con
una excepción es un gran
recordatorio de que algo está mal :
public static void setNumberEggs(int numberEggs) {
if (numberEggs < 0)
throw new IllegalArgumentException(
"# eggs must not be negative");
this.numberEggs = numberEggs;
}
El programa se emite una excepción cuando no está satisfecho con los valores de los
parámetros . los
la salida es el siguiente :
Excepción en el hilo " principales" java.lang.IllegalArgumentException : # huevos no debe
ser negativo
Es evidente que este es un problema que debe ser fijo si el programador quiere que el
programa para hacer
nada útil .
NullPointerException
variables y métodos de instancia deben ser llamados en una referencia no nula . Si la
referencia es
nula , la JVM lanzará una NullPointerException . Por lo general es sutil, como este
ejemplo ,
que verifica si usted recuerda ejemplo, las referencias a variables por defecto en nulo .
String name;
public void printLength() throws NullPointerException {
System.out.println(name.length());
}
Al ejecutar este código da como resultado esta salida :
Exception in thread "main" java.lang.NullPointerException
NumberFormatException
Java proporciona métodos para convertir cadenas en números . Cuando éstos se pasan
un valor no válido , se lanza un NumberFormatException . La idea es similar a
IllegalArgumentException . Dado que este es un problema común , Java le da una clase
separada .
De hecho , NumberFormatException es una subclase de IllegalArgumentException . He
aquí una
ejemplo de tratar de convertir algo que no numérico en un int :
Integer.parseInt("abc");
La salida es el siguiente :
Exception in thread "main" java.lang.NumberFormatException: For input string:
"abc"
Checked Exceptions
Las excepciones comprobadas tienen Excepción en su jerarquía , pero no
RuntimeException . Ellos
deben ser manejados o declarada . Ellos pueden ser lanzados por el programador o por la
JVM .
excepciones de tiempo de ejecución comunes incluyen los siguientes :
Se lanza FileNotFoundException mediante programación cuando el código intenta hacer
referencia a un expediente
eso no existe
Se lanza IOException programación cuando hay un problema de lectura o escritura de un
expediente
Para el examen de OCA , sólo es necesario saber que estas son excepciones
comprobadas . también hay que tener
en cuenta que FileNotFoundException es una subclase de IOException , aunque el
examen se
recordarle de ese hecho si sale . Vas a ver estas dos excepciones con más detalle en el
examen de OCP .
Errors
Los errores se extienden a la clase de error . Ellos son arrojados por la JVM y no deben
ser manipulados o
declarado. Los errores son raros, pero es posible que vea los siguientes:
ExceptionInInitializerError lanzada por la JVM cuando un inicializador estático lanza
una excepción y no manejarlo
StackOverflowError lanzada por la JVM cuando un método llama a sí misma
demasiadas veces
( Esto se llama infi nita recursividad porque el método normalmente llama a sí misma sin
fin)
NoClassDefFoundError Lanzado por la JVM cuando una clase que utiliza el código está
disponible
en tiempo de compilación , pero no se runtime
ExceptionInInitializerError
Java se ejecuta inicializadores estáticos primera vez se utiliza una clase . Si uno de los
inicializadores estáticos
produce una excepción , Java no puede comenzar a utilizar la clase . Declara la derrota
lanzando una
ExceptionInInitializerError . Este código muestra un ArrayIndexOutOfBounds en una
estática
inicializador
static {
int[] countsOfMoose = new int[3];
int num = countsOfMoose[-1];
}
public static void main(String[] args) { }
Este código se obtiene información sobre dos excepciones :
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.ArrayIndexOutOfBoundsException: -1
Obtenemos el ExceptionInInitializerError porque ocurrió el error en un inicializador estático
.
Esa información por sí sola no sería particularmente útil en la que se fijan el problema. Por
lo tanto,
Java también nos dice la causa original del problema : la
ArrayIndexOutOfBoundsException que
tenemos que fi jar .
El ExceptionInInitializerError es un error porque Java no se pudo cargar la totalidad
clase. Este fracaso impide Java de continuar .
StackOverflowError
Cuando Java llama a métodos , se pone parámetros y variables locales en la pila.
Después de hacer
esto un gran número de veces , la pila se agote el espacio y flujos OVERFL . Esto se
llama una
StackOverflowError . La mayoría de las veces, este error se produce cuando un método
llama a sí misma .
public static void doNotCodeThis(int num) {
doNotCodeThis(1);
}
La salida es:
Exception in thread "main" java.lang.StackOverflowError
Dado que el método llama a sí mismo , nunca va a terminar . Con el tiempo , Java se
queda sin espacio en el
apilar y lanza el error . Esto se llama recursividad infinita infi . Es mejor que un bucle
infinito infi
porque al menos Java cogerlo y tirar el error . Con un bucle infi nita , Java sólo utiliza
toda su CPU hasta que pueda acabar con él .
NoClassDefFoundError
Este error no se mostrará en el código en el examen - sólo tiene que saber que es un
error .
NoClassDefFoundError se produce cuando Java no puede hallar la clase en tiempo de
ejecución .
Descargar