"Hej Amigo!
"Jag vill berätta om något litet, men intressant."
"Jag lyssnar. Jag älskar saker som är små och intressanta."
"Tja, du vet att varje Thread-objekt har en run()-metod. Och att du kan köra den på en separat tråd med hjälp av start()-metoden."
"Ja självklart."
"Men föreställ dig nu den här situationen: du startar en tråd för att utföra en del arbete, men ett undantag kastas och tråden slutar att köras eftersom den inte vet vad den ska göra. Skulle du inte behöva veta om det här felet på något sätt?"
"Jag håller med. Jag måste på något sätt fånga undantaget som inträffade i den andra pågående tråden. Stöder Java ens det?"
"Du förolämpar mig. Självklart gör det det."
"Javas skapare uppfann ett speciellt gränssnitt som heter UncaughtExceptionHandler. Så här fångar och hanterar du ett undantag som inträffar på en annan tråd, om den tråden inte fångar det:"
public class DownloadManager
{
public static void main(String[] args)
{
Thread thread = new DownloadThread();
thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException(Thread t, Throwable e)
{
}
});
thread.start();
}
"Thread-objektet har en speciell setUncaughtExceptionHandler -metod. Du måste skicka till det ett objekt som implementerar Thread.UncaughtExceptionHandler -gränssnittet. Detta gränssnitt har bara en metod: uncaughtException(Thread t, Throwable e) . Detta är metoden som kommer att anropas på det skickade objektet om ett ouppfångat undantag inträffar i körmetoden."
"I mitt exempel ovan deklarerar jag helt enkelt en anonym inre klass (markerad i rött) som implementerar tråden. Thread.UncaughtExceptionHandler -gränssnittet. Och jag åsidosätter dess uncaughtException(Thread t, Throwable e) -metod."
"Som du kan se från metodens parameterlista kommer två argument att skickas: en referens till Thread-objektet där undantaget inträffade och själva undantaget som skickas som Throwable e."
"Tja, varför behöver jag Thread-variabeln t? Vet vi inte redan vilken Thread vi lägger ett Thread.UncaughtExceptionHandler -objekt i?"
"De gjorde detta så att du kan skriva en universell hanterare för dessa situationer. dvs. du kan skapa ett enda objekt och skicka det till dussintals olika trådar. Sedan ger metoden uncaughtException( Thread t, Throwable e) dig alltid en referens till Trådobjekt där undantaget inträffade."
"Dessutom kan du skapa dussintals trådar, till exempel i en loop för att utföra specifika uppgifter. I allmänhet kommer denna hänvisning till Thread-objektet inte att vara överflödig. Jag lovar dig det."
"Jag tror dig. Du har aldrig haft fel."
GO TO FULL VERSION