在java多线程中编程中,异常处理非常重要,会影响应用程序的整体运行情况。
1、线程中可以捕捉的异常
我们在普通的方法中,是支持exception往上层throw,简单来说,就是当前逻辑不处理异常,捕捉到该异常后,向上层调用方传递,让上层调用方去处理,层层上扔,最后直接扔给用户(比如扔到html页面)。
线程的一个处理逻辑是:因为线程是调度的基本单位,因此有了错误,尽量自己解决。
因为线程是有逻辑的,一个线程就应该完成一种工作,而主线程把任务交给子线程以后,也不应该再去关注子线程的异常,因此子线程自己要处理异常;
@Override
public void run() {
while(true){
try {
throw new Exception();//该异常必须要在run方法内捕捉
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
假如java有编译器发现的异常,就必须在线程内捕捉。
2、动态运行的异常
但是异常很多,并不是所有的异常都能够在编译器捕捉到,在没有办法的情况下,异常还是抛出到线程外,这个时候,会造成该线程异常停止,比如除数为0的情况。
@Override
public void run() {
while(true){
System.out.println(4/0);//除数为0,会抛出运行时异常
}
}
3、线程异常会不会影响其他线程
当我们一次创建了10个线程,其中有2个线程异常,会影响其他线程吗?答案是:在没有相互通信的情况下,是不会干扰其他线程的。
即在多线程中,线程是不会相互因为异常而产生直接干扰的。