¿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.
- Ocultar clases de biblioteca - Android
- ¿Puedo incluir de alguna manera y utilizar varias versiones de una biblioteca .jar determinada?
- Acceder a funciones comunes estáticas?
- No se puede actualizar la vista de lista de android en onPostExecute
- Algoritmo rápido para invertir un valor de color ARGB a ABGR?
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?
- Convención de paquetes Java
- Cargar imágenes de la carpeta de activos
- ¿Por qué LinearLayout instance.getLayoutParams busca tener una clase incorrecta?
- ¿Cómo publicar pares clave / valor con una subida de archivo en android
- Android 4.4.2 Protocolo SSL abortado
- ¿Pueden las aplicaciones de Android tener sus variables leídas / fijadas malévola?
- Patrón de caracteres 'L' en SimpleDateFormat
- Android Studio en mac: no puedo encontrar el compilador del sistema
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
.
- Varias resoluciones de pantalla / relaciones de aspecto (juegos)
- Realice una actualización ProgressBar sin problemas