2010-11-16 11 views
6

Esto es asumiendo que no llamamos al método .printstacktrace - simplemente lanzando y atrapando.¿Se generan trazas de pila cuando se lanza una excepción de Java?

Estamos considerando esto para algunos cuellos de botella de rendimiento.

+3

Si desea un rendimiento, no debería lanzar una excepción, solo debería ser para casos excepcionales que no afecten su rendimiento. Tal vez puedas hacer lo que intentas sin una excepción? –

Respuesta

10

Sí. Los constructores Throwable() llaman a fillInStackTrace(). (Al menos en Sun/Oracle's JDK 6 para Windows.)

+3

también, si le importa el rendimiento puede anular 'fillInStackTrace()' para no hacer nada –

+3

Hay una diferencia entre lanzar una excepción y construir una. –

+0

Tiene toda la razón, Andy. No leí la pregunta con cuidado. – perp

6

Stacktrace se captura cuando se construye una excepción.

Si realmente no te importa stacktrace, puedes construir una excepción una vez y lanzarla varias veces, pero parece un truco y puede ser confuso.

4

Un objeto arrojable captura la pila actual (usando código nativo) si se imprimirá o no. Esa es la razón por la cual las Excepciones no deben usarse (ab) para el flujo de control.

2

no se construye con pereza cuando el método printStackTrace() se llama

Neal Gafter (ex ingeniero de Sun en el equipo que construye Java) menciona el rendimiento excepción here:

La parte más cara de excepción de manipulación, con mucho, es la captura de la traza de la pila al crear la excepción

Además, vea this question.

+0

Las excepciones cuestan mucho porque cada vez que se lanza una excepción, el rastreo de pila debe crearse y rellenarse. Imagine una operación de transferencia de saldos que falla en el 1% de los casos debido a la falta de fondos. Incluso con esta tasa relativamente baja de fallas, el rendimiento puede verse gravemente afectado. Vea el código fuente y los resultados del benchmark aquí: http://www.jquantlib.org/index.php/Cost_of_Exceptions_in_Java –

Cuestiones relacionadas