Es porque la desreferencia siempre ocurre cuando no hay un nombre disponible. El valor se carga en la pila de operandos y luego se pasa a uno de los códigos de operación JRE que lo desreferencia. Sin embargo, la pila de operandos no tiene un nombre para asociar con un valor nulo. Todo lo que tiene es 'nulo'. Con algún código de seguimiento inteligente en tiempo de ejecución, se puede derivar un nombre, pero eso agregaría sobrecarga con un valor limitado.
Debido a esto, no hay una opción JRE que active la información adicional para las excepciones de puntero nulo.
En este ejemplo, la referencia se almacena en la ranura local 1, que se asigna a un nombre de variable local.Pero el desreferenciar sucede en la instrucción invokevirtual, que sólo ve un valor 'nulo' en la pila, y luego lanza una excepción:
15 aload_1
16 invokevirtual #5
igualmente válida sería una carga del array seguido por una falta de referencia, pero en este caso no hay un nombre para asignar al valor 'nulo', solo un índice fuera de otro valor.
76 aload 5
78 iconst_0
79 aaload
80 invokevirtual #5
No se puede asignar los nombres de forma estática a cada instrucción, ya sea - este ejemplo produce una gran cantidad de código de bytes, pero se puede ver que la instrucción desreferenciar recibirá ya sea objA o objB, y que tendría que realizar un seguimiento de este dinámicamente reportar el más adecuado, ya que ambas variables de flujo a la misma instrucción eliminar la referencia:
(myflag ? objA : objB).toString()
Esto realmente nunca ha sido un problema para mí en más de 8 años de ser un desarrollador profesional de Java. Si tiene muchas referencias que pueden ser nulas en una línea, puede ser hora de dividirla en varias líneas. – MattC
@mattc, ¿nunca trabajas con el código de biblioteca de otras personas? –
@MattC: Suele aparecer cuando necesita llamar a una función con varios argumentos en una condición en el medio de un bloque largo if-else-if. Descomponerlo en múltiples líneas significaría subir y declarar un grupo de variables ficticias antes de la parte superior del 'si'. Diría que en la mayoría de los casos esto sería más problemático en términos de legibilidad y estilo del código. – kpozin