2010-05-29 9 views
7


Como el título sugiere, ¿cómo puedo saber una JVM lanzado excepción de un programación (¿quiere esto decir, lanzada por un programador o el programa) lanzado excepción?¿Cómo diferenciar entre el programador y JVM excepciones


Excepciones JVM


1) ArrayIndexOutOfBoundsException

2) ClassCastException

3) NullPointerExc eption



programación arrojados


1) NumberFormatException

2) AssertionError


Muchas Gracias

Respuesta

4

no estoy seguro de lo que quiere decir con excepción de JVM. Estas son todas las excepciones de tiempo de ejecución que puede lanzar el programador en cualquier punto (excepción AssertionError), aunque se considera un estilo pobre arrojar ciertas excepciones como NullPointerException. El punto es que no hay una sola cualidad que separe las dos categorías que menciona aparte de su uso típico. Todas las excepciones de tiempo de ejecución se extienden, directa o indirectamente, RuntimeException.

De los JavaDocs para Throwable:

Sólo los objetos que son instancias de esta clase (o una de sus subclases) son arrojados por la máquina virtual de Java o puede ser lanzado por el Java tirar declaración.

Como esta misma superclase define todas las excepciones lanzadas por la JVM o por un programador, no es fácil distinguirlas.

+0

Excepciones JVM Esas excepciones o errores que son exclusivamente o la mayoría lógicamente lanzados por la JVM. Excepciones programáticas Las excepciones que se lanzan explícitamente por la aplicación y/o programadores de API. – Haxed

+0

@ Habilitado: el problema es que el programador puede lanzar explícitamente CUALQUIER excepción (excepto AssertionError). Por lo tanto, no puedes hacer lo que quieres hacer. – NotMe

+0

@Chris: AssertionError es Throwable, solo estaba aclarando que no es una RuntimeException como las demás. –

3

No creo que usted encontrará una lista completa, ya que no existe una clara distinción entre JVM y excepciones programador iniciado, aparte de unos pocos casos especiales:

  • más Error clases son arrojados por la máquina virtual , debido a causas internas o externas. La única excepción ThreadDeath, se lanza en un subproceso cuando se detiene ese subproceso, y es una especie de "truco" para que el subproceso desenrolle su pila y salga.
  • Las excepciones más comprobadas se relacionan con problemas medioambientales que provocan la falla de alguna operación, pero pueden resolverse y no son fatales para la JVM (IOException, SQLException, RemoteException).
  • el resto, excepciones sin marcar, son una combinación de jvm y excepción iniciada por el programador. Por ejemplo, el JDK arroja IllegalArgumentException cuando los parámetros del método no son específicos. ¿Es eso una excepción JVM o una excepción programática? No está claro si su definición de excepciones JVM incluye el JDK o no. ArrayIndexOutOfBounds se genera para accesos ilegales a la matriz, generados por la JVM, pero también se incluye en algunas apis, p. Track.get de java.midi. (Aunque esto puede argumentar que la falta de forma, y ​​la superclase IndexOutOfBounds debería haberse utilizado en su lugar.)
5

No se puede hacer esto de forma estática porque no existe tal distinción.

Cualquier excepción definida en las bibliotecas de clase Java estándar puede ser lanzada por la aplicación o el código de la biblioteca de terceros. En algunos casos, es una mala idea (o incluso terrible) arrojar una excepción estándar, pero en otros es lo que se recomienda hacer.

La única manera posible de distinguir entre una excepción lanzada por la JVM y por código de aplicación es examinar los marcos de la pila de la excepción lanzada para descubrir qué clase creó una instancia de la excepción. (En sentido estricto, eso no indica dónde se lanzó la excepción ... pero está lo suficientemente cerca dado que las excepciones casi siempre se ejemplifican y arrojan en la misma declaración.)

Pero incluso esto no es particularmente útil que hacer. Quiero decir, ¿cuál es la diferencia semántica entre una excepción arrojada por el código de la aplicación y la biblioteca de la clase? Ciertamente no dice nada sobre la causa raíz del problema.

+0

Esto no siempre es cierto. Aunque es difícil saber qué es lo que arroja jvm, es bastante fácil decir qué es claramente un error del compilador. Ver mdma para un buen ejemplo. Las excepciones comprobadas existen solo bajo excepción y deben capturarse o lanzarse o el compilador fallará (IOException, ReflectiveOperationException, FontFormatException, CloneNotSupportedException, RemoteException; más incluyendo sus subclases). –

+0

@AndrewScottEvans - Lo siento pero tu comentario tiene poco sentido para mí. Sí, seguro que todos conocemos la distinción entre las excepciones marcadas y las no verificadas, y que las excepciones marcadas deben capturarse o declararse como 'lanzadas'. Pero el control versus la falta de control no es la distinción que la Pregunta intenta hacer. –

+0

Esto es realmente lo que está pidiendo. La mejor forma de saber qué arrojará el programador es con las excepciones de tiempo de compilación comprobadas. Siempre deben lanzarse programáticamente, explícitamente. Las excepciones y errores de JVM se lanzan en el tiempo de ejecución. La mayoría existe en tiempo de ejecución y TODOS están desmarcados. Recomiendo leer una guía de estudio o libro de prueba de SE7 I. Ayudará. –

Cuestiones relacionadas