java捕获线程异常

jdk1.5之前,线程不允许抛出异常(各个线程要把自己的checked exception处理掉),但是无法避免的是uncheckedexception,也就是RuntimeException,当抛出异常时子线程会结束,但不会影响主线程主线程通过try catch是无法捕获子线程异常的,Thread对象提供了setUncaughtExceptionHandler(Thread.UncaughtExceptionHandlereh)方法用来获取线程中产生的异常

import java.lang.Thread.UncaughtExceptionHandler;

public class ThreadTest1 {

	public static void main(String[] args) {
		MyThread my = new MyThread();
		my.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
			public void uncaughtException(Thread t, Throwable e) {
				System.out.println(t.getName() + " : " + e.getMessage());
				// TODO
			}
	    });
		try {
			my.start();
		} catch (Exception e) {
			System.out.println("error");
		}
	}
	
	public static class  MyThread extends Thread {
		public MyThread() {}
		public void run() {
		    System.out.println("abc");  
     		throw new RuntimeException("just a test");
	}
	}
}
:下面这种方式无法捕获到线程中抛出的异常。
public static void main(String[] args) {
	MyThread my = new MyThread();
	try {
		my.start();
	} catch (Exception e) {
		System.out.println("error");
	}
}

在jdk1.5以后,引入了callable,该类可以让线程又返回值,同时可以抛出异常。如下:

public class ThreadTest2 {

	public static void main(String[] args) {
		ExecutorService pool = Executors.newFixedThreadPool(2); 
		Callable<String> c1 = new MyThread();
		Future<String> future = pool.submit(c1);
		
		try {
			System.out.println(future.get());
		} catch (Exception e) {
			System.out.println("error....");
		} finally {
			pool.shutdown();
		}
	}
	
	public static class  MyThread implements Callable<String> {
		public MyThread() {}
	
		@Override
		public String call() throws Exception {
			int a = 1/0;
			return "abc";
		}
	}
}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java 中,我们可以通过捕获全局异常来处理程序中未被处理的异常。全局异常处理器可以处理任何未被捕获异常,无论是在应用程序的线程还是在其他线程中发生。 下面是一个简单的示例代码,演示如何使用全局异常处理器: ```java public class GlobalExceptionHandler implements Thread.UncaughtExceptionHandler { @Override public void uncaughtException(Thread t, Throwable e) { // 处理异常的代码 System.out.println("An exception occurred: " + e.getMessage()); } public static void main(String[] args) { // 设置全局异常处理器 Thread.setDefaultUncaughtExceptionHandler(new GlobalExceptionHandler()); // 抛出一个异常 throw new RuntimeException("Oops, something went wrong!"); } } ``` 在上面的代码中,我们定义了一个名为 `GlobalExceptionHandler` 的类,它实现了 `Thread.UncaughtExceptionHandler` 接口,并重写了其中的 `uncaughtException` 方法。在 `main` 方法中,我们通过调用 `Thread.setDefaultUncaughtExceptionHandler` 方法来设置全局异常处理器为 `GlobalExceptionHandler` 类的实例。接下来,我们抛出一个运行时异常,这导致全局异常处理器被调用。在这个处理器中,我们可以编写代码来处理异常,例如记录日志、发送错误报告等等。 需要注意的是,全局异常处理器只能处理未被捕获异常。如果异常已经被 `try-catch` 块捕获,那么全局异常处理器将不被调用。因此,在编写代码时,我们应该尽可能地使用 `try-catch` 块来捕获异常,并在必要时使用全局异常处理器来处理未被捕获异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值