Thread.UncaughtExceptionHandler

原文链接:http://blog.csdn.net/hahahacff/article/details/8228034

在主线程中直接捕获子线程的异常是捕获不到的(如果不做特殊处理),这样可能会导致程序还是会异常退出,而且异常的时候无法回收一些系统资源,或者没有关闭当前的连接等等。

public class TestUncaughtExceptionHandler {

/**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Thread thread = null;
  try {
   thread = new Thread(new Runnable() {

@Override
    public void run() {
           // TODO Auto-generated method stub
      for (int i = 0; i < 5; i++) {
       if (i == 0)
        throw new RuntimeException();

int a = 1 / i;
       System.out.println("a=" + a);
  }
     }
   });
  } catch (Exception e) {
   e.printStackTrace();
   System.out.println("haha");//这句代码不会执行,而且程序可能会崩溃。
  }
  thread.start();

}
}

这个时候可以通过Thread实例的setUncaughtExceptionHandler方法来捕获异常。

public class TestUncaughtExceptionHandler {

/**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Thread     thread = new Thread(new Runnable() {

@Override
    public void run() {
           // TODO Auto-generated method stub
      for (int i = 0; i < 5; i++) {
       if (i == 0)
        throw new RuntimeException();

int a = 1 / i;
       System.out.println("a=" + a);
  }
     }
   });
 thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
   
   @Override
   public void uncaughtException(Thread arg0, Throwable arg1) {
    // TODO Auto-generated method stub

System.out.println("haha");//这段代码会执行。
    
   }
  });
  thread.start();

}
}

当然也可以通过所有Thread设置一个默认的UncaughtExceptionHandler,通过调用
Thread.setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler
eh)方法,这是Thread的一个static方法。

public class TestUncaughtExceptionHandler {

/**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub

//为所有的Thread设置这个静态的方法,如果thread不做特殊处理,就可以通过这个方法捕获到异常。

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
   
   @Override
   public void uncaughtException(Thread t, Throwable e) {
    // TODO Auto-generated method stub
    
   }
  });

Thread     thread = new Thread(new Runnable() {

@Override
    public void run() {
           // TODO Auto-generated method stub
      for (int i = 0; i < 5; i++) {
       if (i == 0)
        throw new RuntimeException();

int a = 1 / i;
       System.out.println("a=" + a);
  }
     }
   });
  thread.start();

}
}

在android应用程序中可以在应用程序的入口中的onCreate方法里面调用

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
   
   @Override
   public void uncaughtException(Thread t, Throwable e) {
    // TODO Auto-generated method stub
    
   }
  });

来捕获异常。

也可以再Application里面的onCreate里面调用

Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
   
   @Override
   public void uncaughtException(Thread t, Throwable e) {
    // TODO Auto-generated method stub
    
   }
  });

这样就可以捕获到多数的Thread内部的异常,提高程序的健壮性。

时间: 2024-10-08 14:06:18

Thread.UncaughtExceptionHandler的相关文章

Android Thread.UncaughtExceptionHandler捕获

在Java 的异常处理机制中:如果抛出的是Exception异常的话,必须有try..catch..进行处理,属于checked exception.如果抛出的是RuntimeException异常的话,则不是必须进行try..catch..异常处理,发生异常之后将由JVM进行处理,属于unchecked exception.注意:为了保证程序的健壮性,建议抛出RunntimeException异常,也使用try..catch..进行处理. 这两者最本质的区别在于设计者认为使用者是否能够并且应该

线程 Thread.UncaughtExceptionHandler 异常捕获

setUncaughtExceptionHandler public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) x 1 public void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 设置该线程由于未捕获到异常而突然终止时调用的处理程序. 通过明确设置未捕获到的异常处理程序,线程可以完全控制它对未捕获到的异常作出响

Android Thread.UncaughtExceptionHandler异常消息捕获

public void uncaughtException(Thread thread, Throwable ex) { //处理异常 Log.e("崩溃",thread.getName()+ex.toString()); //发送到服务器 //dialog提醒 } 重写Application的onTerminate() 关闭整个程序后做的来操作:

Java thread中对异常的处理策略

转载:http://shmilyaw-hotmail-com.iteye.com/blog/1881302 前言 想讨论这个话题有一段时间了.记得几年前的时候去面试,有人就问过我一个类似的问题.就是java thread中对于异常的处理情况.由于java thread本身牵涉到并发.锁等相关的问题已经够复杂了.再加上异常处理这些东西,使得它更加特殊. 概括起来,不外乎是三个主要的问题.1. 在java启动的线程里可以抛出异常吗? 2. 在启动的线程里可以捕捉异常吗? 3. 如果可以捕捉异常,对于

UncaughtExceptionHandler

/** * 崩溃信息处理 * Created by travis on 2016/1/21. */ public class VIIUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { private static final String TAG = VIIUncaughtExceptionHandler.class.getSimpleName(); private Thread.UncaughtExcept

Java Thread 相关的函数

构造方法摘要 Thread()          分配新的 Thread 对象. Thread(Runnable target)          分配新的 Thread 对象. Thread(Runnable target, String name)          分配新的 Thread 对象. Thread(String name)          分配新的 Thread 对象. Thread(ThreadGroup group, Runnable target)          分

多线程 Thread 示例 API

多线程-同步的两种方式 一个储户,向两个账户存钱,每次存100,共存3次 public class Demo {     public static void main(String[] args) {         Cus c = new Cus();//只为多个[线程]创建一个[线程任务]对象,否则同步是没有意义的         new Thread(c, "第一个线程").start();         new Thread(c, "第二个线程").st

Thread类详解

java.lang 类 Thread java.lang.Object java.lang.Thread 所有已实现的接口: Runnable public class Threadextends Objectimplements Runnable 线程 是程序中的执行线程.Java 虚拟机允许应用程序并发地运行多个执行线程. 每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程.每个线程都可以或不可以标记为一个守护程序.当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的

JAVA Thread线程异常监控

一.场景描述:单线程程序可以用try...catch捕获程序的异常,而在多线程程序的时候是无法使用try...catch捕获. 示例1:多线程发生异常,无法使用try...catch捕获问题 public class NoCaughtThread implements Runnable{ @Override public void run() { System.out.println(3 / 2); System.out.println(3 / 0); System.out.println(3