Gibt es eine Möglichkeit, Runnable Run () eine Ausnahme auszulösen?
Einer Methode, die ich Vorschlage, in laufen() in einer Klasse, die Runnable) ist entworfen, um eine Ausnahme zu werfen.
Aber der Java-compiler nicht lass es mich tun, und schlägt vor, dass ich umgebe es mit try/catch.
Das problem ist, dass, um es mit einem try/catch-ich , insbesondere laufen() nutzlos. Ich tun werfen wollen, die Ausnahme.
Wenn ich angeben throws
für laufen() sich der compiler beschwert sich, dass Exception is not compatible with throws clause in Runnable.run()
.
Normalerweise ich bin völlig in Ordnung mit der Vermietung nicht laufen() eine Ausnahme werfen. Aber ich habe einzigartige situation, in der die muss ich haben Funktionalität.
Wie ich diese Beschränkung umgehen?
InformationsquelleAutor der Frage Regex Rookie | 2012-07-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wollen, eine Klasse, die
Runnable
in dieThread
Rahmen, dann haben Sie zu spielen, indem das framework die Regeln, siehe Ernest Friedman-Hill ' s Antwort, warum es tun, sonst ist eine schlechte Idee.Ich habe eine Ahnung, aber, dass Sie anrufen möchten
run
- Methode direkt in Ihrem code, so dass Ihre aufrufende code die Ausnahme.Antwort auf dieses problem ist einfach. Verwenden Sie nicht
Runnable
Schnittstelle von der Thread-Bibliothek, sondern erstellen Sie Ihre eigene Benutzeroberfläche, mit der geänderten Signatur, die es ermöglicht checked exception geworfen werden, z.B.Können Sie selbst erstellen einen adapter konvertiert diese Schnittstelle zu realen
Runnable
( durch den Umgang mit checked exception ) geeignet für den Einsatz in den Thread-Rahmen.InformationsquelleAutor der Antwort Alexander Pogrebnyak
Können Sie eine
Callable
stattdessen die Vorlage einerExecutorService
und warten auf das Ergebnis mitFutureTask.isDone()
zurück durch dieExecutorService.submit()
.Wenn
isDone()
true zurückgibt, rufen SieFutureTask.get()
. Nun, wenn IhrCallable
geworfen hat eineException
dannFutureTask.get()
wiill werfen einException
zu und die ursprüngliche Ausnahme werden Sie in der Lage zu erreichen, dieException.getCause()
.InformationsquelleAutor der Antwort Alexander Kulyakhtin
Wenn
run()
warf eine checked exception, was fangen würde? Es gibt keine Möglichkeit für Sie, um zu schließen, dassrun()
Aufruf in einer Prozedur, da Sie nicht schreiben den code, der ruft ihn.Können Sie fangen Ihr aufgegebenes Ausnahme in der
run()
Methode, und wirft eine unchekced Ausnahme (d.h.,RuntimeException
) an seinem Platz. Diese beendet den thread mit einem stack-trace, vielleicht das ist, was Sie suchen.Wenn Sie stattdessen möchten, dass Ihre
run()
Methode um den Fehler zu melden irgendwo, dann kann man einfach einen callback-Methode für dierun()
Methodecatch
block zu nennen; Methode speichern könnte die exception-Objekt irgendwo, und dann Ihr Interesse thread finden konnte, das Objekt in dieser Lage.InformationsquelleAutor der Antwort Ernest Friedman-Hill
Ja, es ist ein Weg, zu werfen, ein überprüft Ausnahme von der
run()
Methode, aber es ist so schrecklich ich will nicht teilen.Hier ist, was Sie tun können, statt; es verwendet den gleichen Mechanismus, der eine Laufzeit-exception würde übung:
Wie andere bemerkt haben, wenn Ihr
run()
Methode ist wirklich das Ziel einesThread
, hat es keinen Sinn, eine Ausnahme zu werfen, denn es ist nicht beobachtbar; eine Ausnahme zu werfen, hat den gleichen Effekt wie nicht eine Ausnahme werfen (keine).Wenn es nicht ein
Thread
Ziel, nicht verwendenRunnable
. Zum Beispiel, vielleichtCallable
eine bessere Passform.InformationsquelleAutor der Antwort erickson
Ich denke, ein listener-pattern könnte Ihnen helfen, mit diesem Szenario. Im Fall einer exception geschieht in Ihrem
run()
Methode mit einem try-catch-block und in den catch-senden Sie eine Benachrichtigung zu einem Ausnahme-Ereignis. Und dann behandeln Sie Ihre Benachrichtigungs-Ereignis. Ich denke, das wäre ein sauberer Ansatz. Das, SO link gibt Ihnen eine hilfreiche Zeiger in die entsprechende Richtung.InformationsquelleAutor der Antwort Sujay
Hier ist, wie Sie wickeln konnte eine Klasse mit geprüften Ausnahmen und immer noch in der Lage sein, um Abdeckung/test die ganze Klasse
}
InformationsquelleAutor der Antwort Matt Broekhuis
Ihre Anforderung nicht sinnvoll. Wenn Sie möchten, zu Benachrichtigen, genannt der thread über eine Ausnahme, die geschehen ist, könnten Sie tun, dass durch eine call-back-Mechanismus. Dies kann durch eine Hf-oder eine broadcast-oder was immer Sie sonst noch denken kann.
InformationsquelleAutor der Antwort Kumar Bibek
Ist der einfachste Weg zu definieren eigener exception-Objekt, das erweitern der
RuntimeException
- Klasse anstelle derException
Klasse.InformationsquelleAutor der Antwort joas