Esta fue la pregunta formulada en una entrevista. NullPointerException
es muy común; ¿Por qué no está declarado como una excepción comprobada? Busqué en Google pero no obtuve una respuesta adecuada.¿Por qué NullPointerException no se declara como una excepción marcada?
Respuesta
Casi todos los métodos tendrían que declarar lanzarlo.
public void myMethod(String param) throws NullPointerException {
//
}
(Como nota al margen -. Eclipse, por ejemplo, le da un aviso cada vez que hay un "potencial de acceso a puntero nulo" por lo que se puede prevenir la excepción tan pronto como sea posible)
excepciones de puntero nulo son extensiones de excepciones de tiempo de ejecución y, por lo tanto, son imprevistos en el flujo de su programa. No tendría sentido esperar que se lanzara una excepción de puntero nulo (¡espero!) Y, por lo tanto, nunca la declararía como una excepción marcada.
No es una excepción marcada (entre otras cosas) porque es extremadamente común. Puede ocurrir prácticamente en todas partes. Si se comprobó, casi cada método en cada programa Java en cualquier lugar tendría que declarar que es throws NullPointerException
.
La respuesta de una frase que daría es que es el resultado de un error de programación, y las excepciones de error de programación no se marcan excepciones (IllegalStateException, ClassCastException, etc.).
Pero incluso si tuviera un argumento de por qué debería ser una excepción marcada, básicamente, todas las operaciones en una referencia de objeto pueden arrojarla, por lo que estaría por todos lados y literalmente cada método en un programa no trivial tendría que tirarlo, entonces, ¿cuál sería el punto?
Mi propia definición obligatoria para Excepción comprobada. Las excepciones comprobadas son excepciones que un API sería elevar en caso de una situación indeseable conocido surge
NullPointerException
s no indica una situación "conocido indeseable". En cambio, generalmente se lanzan debido a situaciones sin mano en el código. Es decir, son la mayoría del tiempo debido a malas prácticas de codificación, como intentar obtener el tamaño de una lista que no se inicializa correctamente, etc. Por lo tanto, no tiene sentido hacer que se marquen excepciones, ya que cada objeto en Java podría ser nulo ¡¿en algún momento?!. NullPoitnerException`s nunca debe ser capturado tampoco.
. El debería estar atrapado arriba en la pila de llamadas para ofrecer una mejor experiencia de usuario, en mi opinión – Yaneeve
Esto suena como "incógnitas conocidas" y "incógnitas desconocidas" de Dick Cheney ;-). –
@yaneeve, creo que "atrapado" significa un cheque como 'if (myList! = Null)' tipo de declaración. Aparte de eso, no debería haber nada como 'catch (NullPointerException npe)' en un código. Eso * nunca * debe pasar una revisión de código. –
Las excepciones comprobadas pueden ocurrir debido a algo en el entorno de , sobre el que su programa tiene poco o ningún control, salió mal (por ejemplo IOException
, SQLException
). Puedes anticiparlo y manejar ese caso.
A NullPointerException
(normalmente) se produce porque hay algún error en su código. Si espera que se genere una NullPointerException, la solución correcta es corregir el error en lugar de manejar la excepción.
@Heinzi - No estoy de acuerdo con el punto "ocurrir porque algo en el medio ambiente". Por ejemplo, un comando de inicio de sesión de JAAS podría lanzar 'LoginException' cuando las credenciales son incorrectas. O un 'AccountService' podría arrojar' InsufficientBalanceException' en algún escenario comercial. Por lo tanto, no están relacionados con el "medio ambiente" per se. –
Bueno, uno podría considerar la entrada del usuario y el almacén de datos como parte del "Entorno", ya que son externos a la lógica del código en sí. –
@ring bearer, una excepción de inicio de sesión es un problema de configuración (entorno) en la mayoría de los casos (el usuario no está configurado o no está configurado con esa contraseña). Las excepciones controladas se pueden usar de la manera que se describe para AccountService, pero como eso es parte de una API teórica desarrollada en casa, no creo que sea un buen ejemplo. – Yishai
¿Por qué incluirlo cuando cada función que escriba tendrá que declararlo? Solo para simplificar tu vida.
Las excepciones comprobadas son solo para las excepciones donde el programa puede recuperarse. Invocar algo en un objeto NULL es un problema para programadores y no se puede recuperar.
SI Se produce una excepción de puntero nulo, su proram se detendrá. Por lo tanto, se trata de una excepción.
- 1. ¿Por qué no se declara NULL?
- 2. ¿Por qué la excepción de tiempo de ejecución es una excepción no marcada?
- 3. ¿Por qué esto no causa una NullPointerException?
- 4. ¿Por qué la clase HttpServlet se declara como abstracta?
- 5. ¿Por qué la estructura GUID se declara tal como es?
- 6. ¿Por qué la memoria no asignada está marcada como 0xCC?
- 7. ¿Por qué un delegado de .NET no se declara estático?
- 8. ¿Por qué este código NO devuelve NullPointerException?
- 9. ¿Por qué NullPointerException es una excepción de tiempo de ejecución y RemoteException no?
- 10. Mockito se rehúsa a arrojar una excepción marcada
- 11. ¿por qué no null.asInstanceOf [Int] lanza una NullPointerException?
- 12. Etiqueta de estructura y nombre, ¿por qué se declara una variable local como compilación de nombre?
- 13. PreferenceActivity da una excepción NullPointerException cuando se selecciona de ListPreference
- 14. ¿No se trata de una excepción no verificada que está atrapada en un intento bloquear una excepción marcada en Java?
- 15. ¿Por qué la clase java.lang.Thread en Java no está marcada como definitiva por los diseñadores?
- 16. ¿Está marcada la clase de excepción java?
- 17. ¿Por qué se declara este evento con un delegado anónimo?
- 18. ¿Por qué el comparador declara iguales?
- 19. RadioButtonList marcada por defecto
- 20. ¿Por qué este campo se declara como privado y también de solo lectura?
- 21. ¿Por qué System.in se declara como nullInputStream() en lugar de nulo?
- 22. ¿Por qué capturar una excepción como referencia-a-const?
- 23. ¿Por qué el servicio Android se bloquea con NullPointerException?
- 24. ¿Por qué Java tiene una "NullPointerException" cuando no hay punteros en Java?
- 25. ¿Por qué no obtengo una NullPointerException en Groovy en este caso?
- 26. ¿Dónde se declara cout?
- 27. ¿Por qué no se solicita el destructor en la excepción?
- 28. declara que un método siempre arroja una excepción?
- 29. ¿Por qué la excepción no se desencadena aquí?
- 30. ¿Por qué no se puede capturar la excepción interna?
+1 - Hará que el código sea muy feo. – duduamar
También: capturar 'NullPointerException' específicamente es casi siempre una mala idea. –
Si Java tuviera la posibilidad de declarar que una función no arroja una determinada excepción, se podría hacer que throws NullPointerException sea un valor predeterminado para cada función. Entonces uno podría declarar funciones que no lanzan una NullPointerException como 'public void myMethod (String param) no lanza NullPointerException' o usa'! Throws' – asmaier