¿Hay alguna manera de ejecutar Runnable ejecutar () lanzar una excepción?

Un método que estoy llamando en run () en una clase que implementa Runnable ) está diseñado para lanzar una excepción.

Pero el compilador de Java no me deja hacer eso y sugiere que lo rodee con try / catch.

El problema es que al rodearlo con un try / catch hago que particular run () sea inútil. Quiero lanzar esa excepción.

Si especifico throws para run () , el compilador se queja de que Exception is not compatible with throws clause in Runnable.run() .

Normalmente estoy totalmente bien con no dejar ejecutar () lanzar una excepción. Pero tengo una situación única en la que debo tener esa funcionalidad.

¿Cómo puedo evitar esta limitación?

Si quieres pasar una clase que implementa Runnable en el marco de Thread , entonces tienes que jugar con las reglas de ese framework, ver la respuesta de Ernest Friedman-Hill por qué hacerlo de otra manera es una mala idea.

Tengo la corazonada, sin embargo, de que desea llamar a run método directamente en su código, por lo que su código de llamada puede procesar la excepción.

La respuesta a este problema es fácil. No utilice la interfaz Runnable de la biblioteca Thread, sino que cree su propia interfaz con la firma modificada que permite que la excepción checked sea lanzada, por ejemplo

 public interface MyRunnable { void myRun ( ) throws MyException; } 

Incluso puede crear un adaptador que convierte esta interfaz en Runnable real (mediante el control de excepción verificada) adecuada para su uso en el marco de Thread.

Puede utilizar un Callable en Callable lugar, Callable a un ExecutorService y esperando el resultado con FutureTask.isDone() devuelto por el ExecutorService.submit() .

Cuando isDone() devuelve true, llama a FutureTask.get() . Ahora, si su Callable ha lanzado una Exception entonces FutureTask.get() también lanzará una Exception y la Excepción original a la que podrá acceder usando Exception.getCause() .

Si run() arrojó una excepción verificada, ¿qué lo atraparía? No hay forma de incluir esa llamada run() en un manejador, ya que no escribe el código que lo invoca.

Puede capturar la excepción marcada en el método run() y lanzar una excepción no comprobada (es decir, RuntimeException ) en su lugar. Esto terminará el hilo con un seguimiento de pila; Tal vez eso es lo que buscas.

Si en su lugar desea que su método run() informe el error en algún lugar, entonces sólo puede proporcionar un método de devolución de llamada para el bloque catch del método run() para llamar; Ese método podría almacenar el objeto de excepción en algún lugar y, a continuación, el hilo interesado podría encontrar el objeto en esa ubicación.

Sí, hay una forma de lanzar una excepción marcada del método run() , pero es tan terrible que no lo comparto.

Esto es lo que puede hacer en su lugar; Utiliza el mismo mecanismo que una excepción de tiempo de ejecución que ejercería:

 @Override public void run() { try { /* Do your thing. */ ... } catch (Exception ex) { Thread t = Thread.currentThread(); t.getUncaughtExceptionHandler().uncaughtException(t, ex); } } 

Como otros han señalado, si su método run() es realmente el objetivo de un Thread , no tiene sentido lanzar una excepción porque es inobservable; Lanzar una excepción tiene el mismo efecto que no lanzar una excepción (ninguna).

Si no es un objetivo Thread , no utilice Runnable . Por ejemplo, tal vez Callable es un ajuste mejor.

Su requisito no tiene ningún sentido. Si desea notificar a la llamada del hilo sobre una excepción que sucedió, podría hacerlo a través de un mecanismo de devolución de llamada. Esto puede ser a través de un Handler o una emisión o cualquier otra cosa que se pueda imaginar.

Creo que un patrón de escucha podría ayudarle con este escenario. En caso de que ocurra una excepción en el método run() , utilice un bloque try-catch y en el catch envíe una notificación de un evento de excepción. Y luego maneje su evento de notificación. Creo que este sería un enfoque más limpio. Este enlace SO le da un indicador útil a esa dirección.

La forma más sencilla es definir su propio objeto de excepción que amplíe la clase RuntimeException lugar de la clase Exception .

  • Aprendiendo C / C ++ y Java
  • Arraylist con objetos personalizados
  • ¿Cómo hago una solicitud http usando cookies en Android?
  • La actividad no se puede asignar a la actividad
  • Utilizando una casilla de verificación con un enfoque en blanco falso, impide que los clics de vista de lista
  • ¿Cómo puedo separar los metadatos y la pista de un flujo de shoutcast sin realizar solicitudes separadas de metadatos y el streaming
  • Acerca de pérdidas de memoria y métodos genéricos
  • AES Encryption Android <-> iOS resultados diferentes en la longitud del mensaje> 15 byte
  • Https post solicitud utilizando curl: Android
  • ¿Crear una transición Fragment como la aplicación Contactos?
  • Fije la posición del ratón en el dispositivo androide arraigado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.