¿Esto fue un descuido? ¿O tiene que ver con la JVM?Java: ¿Por qué las NullPointerExceptions no se llaman NullReferenceExceptions?
Respuesta
Java sí tiene punteros - punteros en los que no se puede realizar la aritmética del puntero.
Desde el venerable JLS:
Hay dos clases de tipos en el lenguaje de programación Java: tipos primitivos (§ 4.2) y los tipos de referencia (§ 4.3). Existen, en consecuencia, dos tipos de valores de datos que pueden almacenarse en variables, pasarse como argumentos, regresar por métodos y operar en: valores primitivos (§4.2) y valores de referencia (§4.3).
Y later:
Un objeto es una instancia de la clase o un array.
Los valores de referencia (a menudo apenas referencias) son punteros a estos objetos, y una referencia nula especial, que se refiere a ningún objeto.
(énfasis suyo)
Por lo tanto, para interpretar, si escribe:
Object myObj = new Object();
continuación myObj
es un tipo referencia que contiene un valor referencia que es en sí mismo un puntero al recién creado Object
.
Por lo tanto si se establece myObj
a null
está configurando el valor de referencia (también conocido como puntero ) a null
. Por lo tanto, se lanza razonablemente una NullPointerException cuando se desreferencia la variable.
No se preocupe: este tema ha sido heartily debated antes.
Supongo que tiene que ver con el hecho de que la JVM está codificada en C++. Aparte de eso, los punteros y las referencias son casi similares. Se podría decir que el mecanismo de referencia en Java se implementa utilizando punteros C++ y el nombre 'NullPointerException' permite que los detalles de implementación brillen.
Esto se debe al hecho de que Java fue diseñado con programadores de C en mente. En C terminoligy se usa la palabra 'puntero' en lugar de 'referencia'
Sí, pero Java utiliza la referencia: p – hhafez
En Java utilizan la nomenclatura REFERENCIA para referirse a objetos creados dinámicamente. En idiomas anteriores, se llama POINTER. Del mismo modo que la denominación de METHODS en lenguajes orientados a objetos ha tomado el relevo de FUNCTION y PROCEDURE anteriores en lenguajes anteriores (orientados a objetos y no orientados a objetos).No hay nada mejor o peor en esta denominación o nuevo estándar, es simplemente otra manera de nombrar el fenómeno de poder crear antiguos objetos dinámicos, colgando en el aire (espacio de pila) y siendo referido por una referencia de objeto fijo (o referencia dinámica también colgando en el aire). Los autores del nuevo estándar (uso de MÉTODOS y REFERENCIAS) mencionaron particularmente que los nuevos estándares se implementaron para hacerlo conforme a los próximos sistemas de planificación, como UML y UP, donde el uso de la terminología orientada a objetos prescribe el uso de ATRIBUTOS, MÉTODOS y REFERENCIAS, y no VARIABLES, FUNCIONES y PUNTEROS.
Ahora, usted puede pensar ahora, que era simplemente un cambio de nombre, pero eso sería simplificar la descripción del proceso y no ser solo por el largo camino que los idiomas han tomado en nombre del desarrollo. Un método es diferente en naturaleza de un procedimiento, ya que opera dentro del alcance de una clase, mientras que el procedimiento en su naturaleza opera en el ámbito global. De manera similar, un atributo no es solo un nuevo nombre para la variable, ya que el atributo es una propiedad de una clase (y su instancia, un objeto). De manera similar, la referencia, que es la pregunta detrás de esta pequeña escritura aquí, es diferente en cuanto a que está tipada, por lo tanto, no tiene la propiedad típica de punteros, ya que se trata de referencias crudas a celdas de memoria, por lo tanto, una referencia es una referencia estructurada objetos basados en memoria.
Ahora, dentro de Java, es decir, en el estómago de Java, hay una capa de arbitraje entre el código C subyacente y el código Java (la Máquina Virtual). En esa capa de arbitraje, se produce una abstracción en el sentido de que la implementación subyacente (bare metal) de las referencias, tal como lo hace la máquina virtual, protege las referencias de referencias bare metal (celdas de memoria sin estructura). La verdad cruda es, por lo tanto, que la NullPointerException es realmente una excepción de puntero nulo, y no solo una excepción de referencia nula. Sin embargo, esa verdad puede ser completamente irrelevante para el programador en el entorno Java, ya que él/ella no estará en ningún momento en contacto con la JVM de metal puro.
Creo que la respuesta es que nunca sabremos realmente la respuesta real.
Sospecho que un tiempo antes de que se lanzara Java 1.0, alguien definió una clase llamada NullPointerException
. O esa persona entendió mal el nombre, o la terminología no se había estabilizado; es decir, no se tomó la decisión de utilizar el término "referencia" en lugar de "puntero".
De cualquier manera, es probable que nadie haya notado que la incoherencia no se pudo solucionar sin romper la compatibilidad con versiones anteriores. Hay otras inconsistencias menores como esta si te ves muy duro. Y algunos problemas más serios que no pudieron solucionarse por la misma razón.
Pero esto es solo una conjetura.
¿Por qué el voto negativo al azar? –
- 1. ¿Por qué las cadenas se llaman "cadenas"?
- 2. ¿Por qué las funciones virtuales en C++ se llaman 'virtuales'?
- 3. ¿Por qué las expresiones lambda se llaman expresiones lambda?
- 4. ¿Por qué las expresiones regulares se llaman expresiones "regulares"?
- 5. ¿Por qué los procesos asincrónicos no se llaman sincrónicos?
- 6. ¿Por qué no se llaman mis fragmentos onSaveInstanceState()?
- 7. ¿Por qué las variables locales también se llaman "Automáticas" en Java?
- 8. ¿Por qué las funciones anidadas de Python no se llaman cierres?
- 9. ¿Por qué las personas llaman a jQuery $ alias 'fábrica'?
- 10. UITableView delegados no se llaman
- 11. ¿Por qué los archivos de comprobación se llaman 'commit'?
- 12. ¿Por qué los hilos se llaman procesos livianos?
- 13. ¿Por qué Java tiene NullPointerException en lugar de NullReferenceException?
- 14. ¿Por qué los subprocesos de nivel de usuario en Java se llaman "verde"?
- 15. ¿Cómo se llaman objetos Scala de Java?
- 16. ¿Por qué las propiedades de colección de C# no se marcan como obsoletas cuando se llaman propiedades sobre ellas?
- 17. ¿Por qué las "pruebas de humo" se llaman "pruebas de humo"?
- 18. Java: ¿Por qué no se recoge basura?
- 19. ¿Por qué las anotaciones Java?
- 20. Captura de "NullPointerExceptions" en JavaScript
- 21. ¿Por qué las enumeraciones no se pueden modificar?
- 22. ¿Por qué java applets/javafx no se usan ampliamente? (por qué no debería usarlos para RIA)
- 23. ¿Por qué las enumeraciones de Java no son clonables?
- 24. ¿por qué las constantes de Java se declaran estáticas?
- 25. ¿Las rutas con parámetros se llaman dos veces?
- 26. ¿Por qué no se desaprobó java.io.Serializable en Java 5?
- 27. ¿Por qué se llaman los métodos no relacionados (autopostback) cuando se invoca un método Asp.Net ListBox autopostback?
- 28. ¿Cómo determinar qué métodos se llaman en un método?
- 29. ¿En qué orden se llaman los métodos de enlace UITableView?
- 30. Métodos públicos y privilegiados en javascript: ¿Por qué se llaman así?
Porque el puntero y la referencia son la misma cosa. No importa qué sinónimo tome para representar la idea. – Val