Tengo curiosidad acerca de cómo es posible que Java JVM a veces incorpore métodos que tienen el potencial de generar excepciones. Supongo que es posible alinear al menos algunos de esos métodos (como los que tienen acceso a la matriz y, por lo tanto, la posibilidad de lanzar ArrayIndexOutOfBoundsException
s). El problema que veo es que si la excepción realmente ocurre, ¿cómo se muestra el seguimiento de pila correcto si se ha introducido el método? Dado que diferentes métodos se pueden insertar en máquinas diferentes, ¿cómo la línea no rompe el mecanismo de seguimiento de la pila?¿Cómo pueden incluirse los métodos que arrojan excepciones?
Respuesta
¿Cuál es el problema que prevé? Dado que es la propia JVM la que realiza la línea de entrada, no hay nada que le impida recordar dónde está en línea y corregirla cuando construye una traza de pila para instalarla en un objeto Throwable.
Cuando una excepción es tirado construido, la JVM caminará la pila de la CPU y averiguar si cada trama de pila de la máquina corresponde a bytecode interpretado, código compilados JIT, código nativo a partir de bibliotecas, etcétera. Para esto se refiere a las tablas que indican qué direcciones del código de máquina corresponden a qué instrucciones del bytecode (y más atrás a las líneas fuente, si esa información está presente en el archivo de la clase). Esta tabla puede especificar perfectamente que un cierto lugar en el código JITted puede corresponder a más de un marco de pila de nivel Java.
Sin embargo, una JVM no es requiere para hacer esto. También puede elegir simplemente construir rastros de pila con rupturas misteriosas en ellos. Vea el javadoc for Throwable.getStackTrace(). (Ni siquiera existe el requisito de que una JVM pueda generar trazas de pila en total).
Es posible que desee echa un vistazo a this document que explica cómo funciona el manejo de excepciones en la JVM:
Cada método que capturas excepciones se asocia con una tabla de excepción que es entregado en el archivo de clase junto con el secuencia bytecode del método . La tabla de excepciones tiene una entrada para cada excepción que es atrapada por cada bloque try. Cada entrada tiene cuatro elementos de información: los puntos de inicio y finalización, la compensación de PC dentro de la secuencia de códigos de bytes para ir a, y un índice de grupo constante de la clase de excepción que es capturado.
Estaré interesado en echarle un vistazo. Sin embargo, estaba preguntando específicamente sobre la interacción de la creación de líneas con excepciones. Parece que si una función está en línea, la información de seguimiento de pila debe perderse, pero aún así no parece estar en un programa Java. – Gravity
Recuerde que la incorporación en Java se lleva a cabo en tiempo de ejecución, no en tiempo de compilación como C/C++, por lo que no está "perdiendo" ninguna información. Cualquier información que esté optimizada y necesite ser recuperada se puede almacenar en una tabla de búsqueda/salto. –
No almacenar información de excepción en tablas de búsqueda provocará un rendimiento inaceptable, especialmente para excepciones muy comunes como ArrayIndexOutOfBounds? – Gravity
- 1. ¿Error del compilador C# ?: No detecta métodos que siempre arrojan excepciones
- 2. auto-generar métodos stub que arrojan en Eclipse
- 3. ¿Hay una convención de nomenclatura particular para los métodos de Java que generan excepciones?
- 4. Al implementar la inyección de dependencia, ¿deberían incluirse excepciones?
- 5. ¿Pueden los fabricantes arrojar excepciones en Java?
- 6. ¿Se pueden sobrecargar los métodos web?
- 7. ¿Suprimir-atrapar o lanzar excepciones que nunca pueden ocurrir?
- 8. ¿Pueden los métodos de Java devolver el tipo Enum?
- 9. ¿Debería incluirse Gemfile.lock en .gitignore?
- 10. ¿Se pueden anular los métodos de categoría? IOS
- 11. ¿Métodos de Javascript que no pueden invocarse desde objetos jquery?
- 12. Elección de diseño: ¿deseo que los métodos de extensión arrojen excepciones en nulo?
- 13. Impresoras bonitas para mapas que arrojan un error de tipo
- 14. ¿Deben incluirse los controladores JDBC en una GUERRA?
- 15. Definición de excepciones que se pueden generar desde un kit de herramientas API
- 16. Código EF Primero: Métodos que se pueden traducir a SQL
- 17. ¿Cómo encontrar excepciones que fueron "ignoradas"?
- 18. ¿Pueden los métodos estáticos que devuelven un valor generar una excepción?
- 19. Cómo evitar que los bots publiquen y causen excepciones
- 20. ¿Cómo se maneja la autorización de acciones que arrojan resultados que no sean ViewResult?
- 21. ¿Pueden los .gitattributes de can git tratar a todos los archivos como binarios, excepto algunas excepciones?
- 22. ¿Cómo manejo los errores en cadenas de métodos en Perl?
- 23. dónde coger excepciones que devuelve Callable.call()
- 24. Rails to_json: métodos que tienen los parámetros
- 25. ¿Se pueden implementar los métodos estáticos y los decodificadores de clase en Python puro?
- 26. ¿Puede una clase C++ incluirse como miembro?
- 27. ¿Cómo se pueden impulsar :: métodos privados de llamada de enlace?
- 28. Cómo unitar los métodos de prueba que usan System.Web.Security.Membership inside?
- 29. ¿Cómo lograr que MATLAB reconozca los métodos estáticos recientemente agregados?
- 30. ¿Cómo escribo los métodos que insertan ejemplos de rspec?
En C++, inline casi garantiza la pérdida de información de la pila. Sin embargo, el hecho de que una traza de pila de excepción carezca de un marco no es el fin del mundo; es solo una consecuencia aceptada de la creación de líneas (y una de las razones por las que los compiladores ofrecen opciones de modo de depuración para suprimir toda la alineación). No sé si Java se comporta igual o no. –
Quise decir que esta era una pregunta de Java, pero interesante saber cómo funciona esto también en C++. – Gravity