2010-05-21 16 views
9

Una posible razón porque una excepción NullPointerException es una excepción en tiempo de ejecución es porque todos los métodos pueden arrojarla, por lo que cada método debería tener una "throws NullPointerException", y sería feo. Pero esto sucede con RemoteException.¿Por qué NullPointerException es una excepción de tiempo de ejecución y RemoteException no?

Y una posible razón porque RemoteException no es una excepción de tiempo de ejecución, es decirle al cliente que trate la excepción. Pero cada método en un entorno remoto necesita lanzarlo, por lo que no hay diferencia de lanzar NullPointerException.

¿Especulaciones? ¿Estaba claro?

+1

cómo hace la gente en un lenguaje que ni siquiera tiene el concepto de excepciones comprobadas? ¿Qué puedes hacer que no se puede hacer limpiamente en otro idioma? el problema es que las personas que consideran "fallas" sean un caso especial en lugar de darse cuenta de que el fracaso es la norma. A este tipo de personas les gustan las grandes declaraciones gigantes de GOTO que verificaron excepciones. ¿Métodos de prueba del estado? Tiempos de espera? Naaaaah. GOTOs gigantes grandes * "si los sh! T golpean al ventilador" *. Prácticamente una especificación de Java y ciertamente ** NO ** reúne a toda la comunidad de Java (por ejemplo, el marco de Spring tiene un gran odio hacia ellos). – SyntaxT3rr0r

+5

Webinator, el chico hizo una pregunta perfectamente razonable. No hay necesidad de despotricar. – DJClayworth

Respuesta

17

No voy a discutir la decisión, solo citaré la explicación de la decisión de Ann Wollrath (quien lidera el diseño e implementación de Java RMI). Esto se extrae de este message de los archivos RMI usuarios (mensaje de Jan 1999):

La decisión de hacer RemoteException un excepción y que requiere remotas métodos para enumerar la excepción de comprobarse su cláusula throws no es uno religioso. La decisión se basa en cómo hacer que la informática distribuida sea confiable. Esta pregunta aparece cada vez en un mientras está en nuestra lista de usuarios. Tengo una respuesta detallada que he publicado un hace tiempo. Aquí está si está interesado . No pude encontrarlo en el archivo de usuarios de rmi , así que lo incluí en a continuación.

aplausos,

- Ann


me gustaría abordar la justificación para hacer RemoteException una marcada Excepción, en lugar de una RuntimeException .

1) redes no son confiables

Me gustaría que lo fueran, pero de hecho, no lo son. Cada red tiene fallas transitorias. Puede construir en redundancia de red, pero el hecho es que la mayoría de las redes no tienen eso. Las intranets tienen fallas transitorias, ya que hace Internet. Por lo tanto, cada RPC realizada, está sujeta a un error. Los tipos de fallas pueden no tener nada que ver con con la "red", per se; si su servidor se queda sin descriptores de archivos, su cliente obtendrá una conexión excepción. Esto no es una falla de red , en el sentido de que la red está rota; su servidor está en un estado transitorio del recurso hambriento.

RMI no está diseñado para manejar solo el caso limitado que toda la red se bloquea cuando una sola máquina se cuelga. Dicha red se consideraría fiable, ya sea todo es hacia arriba o hacia abajo todo es - no hay fallo parcial. RMI está destinado a para una audiencia más general.

2) RPC fracaso no se puede ocultar de el cliente

fracaso parcial de programación es un hecho de la distribuido; estas fallas no se pueden ocultar al programa . Un fallo aparece en el cliente , si la excepción es facturado o de excepción no comprobada, que sigue apareciendo. Entonces, ¿cómo deben indicarse tales fallas al cliente?

3) excepciones comprobadas fomentan más programas robustos

Hubo un tiempo en que el roble y primera versión de Java no tenían excepciones marcada. El manejo de excepciones fue de advertencia, y el mundo no era seguro . Fue nuestro grupo (Jim Waldo y yo en particular :-) que recomienda que haya excepciones controladas por el compilador. Jim era bastante convincente en sus argumentos, diciendo de un mundo en el código robusto haría reinado. Después de alguna consideración, Java se ha actualizado para haber comprobado excepciones. Sólo aquellas excepciones para que no hubo recuperación reflejan errores de aplicación sería sin control (por ejemplo, OutOfMemoryError, NullPointerException respectivamente). Y el mundo estaba a salvo otra vez.

Imagine los ingenieros de Java sorpresa cuando muchas excepciones en el API de Java y el compilador fueron cambiados de sin marcar para comprobar, y el compilador cumplir la distinción, ellos errores descubiertos en las implementaciones! Por lo tanto, los mejores esfuerzos para manejar las condiciones de error , aunque bien intencionadas, no fueron lo suficientemente buenas. Ese compilador es útil para algo :-)

4) RemoteException debe ser una excepción comprobada

Ok, por lo que volver a la pista aquí. Desde un RemoteException es un hecho de la vida en una llamada RPC (véase # 1, # 2) y comprueba excepciones le obligan a escribir el código de seguridad (# 3), pensamos que hacer RemoteException una excepción comprobada era una buena idea. Escribir programas robustos distribuidos es suficientemente difícil, sin tener el compilador para ayudar con excepciones.

Por lo tanto, algunos podrían argumentar que una RemoteException es como un OutOfMemoryError; su programa debería caer muerto si falla una llamada remota. No estoy de acuerdo con este punto. Sí, en el en algunos casos, no hay recuperación desde una RemoteException; pero si usted es escribiendo un programa distribuido confiable , su cliente necesita detectar fallas y volver a intentarlo de manera adecuada. Quizás deba ponerse en contacto con otro servidor , o cancelar una transacción de algún tipo de . Si la RemoteException no está en manejada, se filtrará y bloqueará su cliente (yuk).

Otros han declarado que hay algunas interfaces remotas que se utilizan en tanto en el caso local y la remota caso y el cliente no debería tener que trato con las excepciones de la caso local, por lo RemoteException no debería tiene que estar en una cláusula throws y no debe ser obligatorio su manejo. Ahora, si nos permitió interfaz remota métodos para omitir RemoteException y tenía un interruptor "CRIM" para generar recibos que lanzar una marcada RemoteException, el cliente tienesin opción en la materia. La decisión de el manejo de excepciones debe permanecer con el cliente. Si define una interfaz que solo arroja las excepciones no marcadas , nunca puede escribir un cliente que quiere que el compilador lo ayude a manejar las excepciones . Ya hemos visto visto en el ejemplo anterior que excepciones comprobadas fomenta el robusto código .

Otro tema que ha aparecido ahora y otra vez es que los desarrolladores necesitan para simplemente traducir las interfaces locales y los utilizan como interfaces remotas. Este puede funcionar para un pequeño conjunto de casos, pero si la interfaz no fue diseñado con concurrencia y fallo parcial y latencia llamada en mente, el protocolo capturado por la interfaz no puede ser apropiado para utilizar en el distribuido caso. ¿Se ha pasado suficiente información en para hacer que las operaciones sean idempotentes? Quizás, pero muy probablemente no.

Poner RemoteException en todos los cláusula throws puede parecer como un dolor, pero su el precio a pagar para escribir aplicaciones distribuidas robustos.

- Ann Wollrath

+1

Parece bastante convencida de que las personas no han escrito "aplicaciones sólidas distribuidas" [sic] en idiomas que ni siquiera tienen el concepto de excepciones comprobadas. Me gustaría tener un poco de lo que estaba fumando el siglo pasado, suena fuerte :) – SyntaxT3rr0r

+7

@Downvoter I ** realmente ** me pregunto por qué esta respuesta ha sido desestimada. Incluso si no está de acuerdo con el autor, estoy publicando la ** referencia **, no una opinión. Los votos negativos emocionales son ridículos. –

+1

No puedo imaginarme por qué alguien menospreciaría esto cuando, independientemente de los sentimientos de las excepciones marcadas, esta sea claramente la respuesta más correcta a la pregunta que podrías obtener. – ColinD

4

Hay mucho más potencial para NullPointerException que RemoteException. Cualquier código que invoque un método en un objeto (lo que significa prácticamente cualquier código Java) podría arrojar un NullPointerException. Solo el código RMI puede arrojar un RemoteException. Este es un pequeño subconjunto de "todo el código".

Al escribir las bibliotecas RMI, los diseñadores decidieron hacer que el código del cliente esperara lidiar con estas excepciones. Teniendo en cuenta la naturaleza de la ejecución remota de código, creo que es razonable.

0

Además RemoteException sólo se aplica al código de java.rmi y javax.rmi paquetes (y sus sub-paquetes), RemoteException es un tipo de IOException, al igual que SocketException es ... y todas IOException s excepciones marcada.

+0

No te rechazaré, pero esta respuesta no es una posible razón para no ser una RuntimeException. RemoteException podría ser solo un tipo de Exception en lugar de IOExeption. Ser una IOException es una decisión tomada después de decidir ser verificada como excepción. –

+0

Todas las excepciones en Java relacionadas con las comunicaciones son subclases de 'IOException'. 'IOException' (y cualquier otra clase que herede de' Exception' en lugar de 'RuntimeException') es una excepción marcada, por lo tanto, cualquier clase que herede de ella también se marcará como excepciones. – Powerlord

2

La manera en que yo entiendo que es:

  • RuntimeExceptions son arrojados por las cosas que eran evitables.
  • Se arrojan excepciones por cosas que no se pudieron evitar pero que se pudieron recuperar
  • Se producen errores por cosas que no se pudieron evitar ni recuperar.

Por ejemplo, NullPointerExceptions siempre se pueden evitar y, por lo tanto, no se verifican las excepciones. Una RemoteException podría ocurrir cuando hay una falla de la red, que no se puede prevenir razonablemente antes de la llamada al método y, por lo tanto, se verifica.

+1

Creo que revertiste "Excepciones" y "RuntimeExceptions" en tu lista. 'NullPointerException' es una' RuntimeException'. – Matthew

+0

¡Ajá, sí! Gracias – Steve

Cuestiones relacionadas