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 .