(Fuente desconocida) en el seguimiento de la pila de excepción

Antecedentes

Esta pregunta está relacionada con ¿Por qué String.valueOf (null) arroja una NullPointerException?

Considere el siguiente fragmento:

public class StringValueOfNull {
    public static void main(String[] args) {
        String.valueOf(null);

        // programmer intention is to invoke valueOf(Object), but instead
        // code invokes valueOf(char[]) and throws NullPointerException
    }
}

Como se explica en la respuesta a la pregunta vinculada, la sobrecarga del método de Java resuelve la invocación anterior aString.valueOf(char[]), que legítimamente resulta en unNullPointerException en tiempo de ejecución.

Compilado en Eclipse yjavac 1.6.0_17, este es el seguimiento de la pila:

Exception in thread "main" java.lang.NullPointerException
        at java.lang.String.<init>(Unknown Source)
        at java.lang.String.valueOf(Unknown Source)
        at StringValueOfNull.main(StringValueOfNull.java:3)

Tenga en cuenta que al seguimiento de la pila anterior le falta elLLAVE información: lo haceNO tener la firma completa de lavalueOf ¡método! Solo diceString.valueOf(Unknown Source)!

En la mayoría de las situaciones que he encontrado, los rastreos de pila de excepción siempre tienen la firma completa de los métodos que están realmente en el rastreo de pila, que por supuesto esmuy útil para identificar el problema de inmediato y una razón principal por la cual se proporciona el seguimiento de la pila (que no hace falta decir que es bastante costoso de construir) en primer lugar.

Y sin embargo, en este caso, el rastro de la pilano ayuda en absoluto. Ha fallado miserablemente al ayudar al programador a identificar el problema.

Como es, puedo ver 3 formas en que un programador puede identificar el problema con el fragmento anterior:

El programador se da cuenta de que el método está sobrecargado y, por regla de resolución, se invoca la sobrecarga "incorrecta" en este casoEl programador usa un buen IDE que le permite ver rápidamente qué método está seleccionadoEn Eclipse, por ejemplo, al pasar el mouse sobre la expresión anterior se le dice rápidamente al programador queString valueOf(char[] data) es de hecho el seleccionadoEl programador examina el código de bytes (¡uf!)

La última opción es probablemente la menos accesible, pero, por supuesto, es la respuesta definitiva (un programador puede malinterpretar la regla de sobrecarga, IDE puede tener errores, pero los códigos de bytes siempre (?) Dicen la verdad sobre lo que se está haciendo).

Las preguntas¿Por qué la traza de la pila es tan poco informativa en este caso con respecto a las firmas de los métodos que realmente están en la traza de la pila?¿Esto se debe al compilador? El tiempo de ejecución? ¿Algo más?¿En qué otros escenarios (¿raros?) Puede el seguimiento de la pila no capturar información esencial como esta?

Respuestas a la pregunta(6)

Su respuesta a la pregunta