线程的异常处理

run()方法中不允许抛出checked exception,可以抛出unchecked exception。

什么是unchecked 和 checked 异常

所有的checked exception异常必须在run()方法中处理。

@Override
	public void run() {
		File file=new File("d://s.txt");
		FileInputStream fileInputStream;
		try {
			fileInputStream=new FileInputStream(file);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			System.out.println("处理异常");//FileNotFoundException 异常为checked exception,所以只能在run()方法中处理掉。
		}
	}
@Override
	public void run() {
		try {
			int a=1/0; //此处发生异常
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println("处理异常");
		}
		
	}

接下来讲unchecked exception

在run方法中每次抛出unchecked exception时线程会终结,而且其他线程完全感受不到其他线程抛出的异常,也就是无法catch这个异常。所以我们还是要在run()方法中处理,

例如以下代码用try/catch将有可能出现异常的代码包起来处理

@Override
	public void run() {
		try {
			int a=1/0; //此处发生异常
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println("处理异常");
		}
		
	}

除了上述方法外还有其他方法:使用thread.setUncaughtExceptionHandler(UncaughtExceptionHandler eh)

方法内部源码

 public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh) {
        checkAccess();
        uncaughtExceptionHandler = eh;
    }

再看UncaughtExceptionHandler 

  public interface UncaughtExceptionHandler {
        /**
         * Method invoked when the given thread terminates due to the
         * given uncaught exception.
         * <p>Any exception thrown by this method will be ignored by the
         * Java Virtual Machine.
         * @param t the thread
         * @param e the exception
         */
        void uncaughtException(Thread t, Throwable e);
    }

当线程发生异常时UncaughtExceptionHandler 中的uncaughtExceptionHandler 方法会被调用,所以我们可以定义一个类实现UncaughtExceptionHandler 接口重写uncaughtExceptionHandler 方法,把我们需要处理异常的业务逻辑写在方法里。然后在thread.start()前面增加thread.setUncaughtExceptionHandler(UncaughtExceptionHandler eh)语句就可以了

废话不说上代码:

public class Test1 implements Runnable{
	

	@Override
	public void run() {
		int a=1/0;//发生异常
	}
	
	public static void main(String[] args) {
		Test1 test1=new Test1();
		Thread thread=new Thread(test1);
		thread.setUncaughtExceptionHandler(new TestUncaughtExceptionHandler());
		thread.start();
	}
	
}
public class TestUncaughtExceptionHandler implements UncaughtExceptionHandler{
	@Override
	public void uncaughtException(Thread t, Throwable e) {
		System.out.println("发生一个异常了");
		System.out.println("线程id="+t.getId());
		System.out.println("异常信息"+e.getMessage());
		e.printStackTrace();
	}
}

结果输出

发生一个异常了
线程id=10
异常信息/ by zero
java.lang.ArithmeticException: / by zero
	at test.Test1.run(Test1.java:18)
	at java.lang.Thread.run(Thread.java:745)

太晚了还有其他的方法下次再说。。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值