run()方法中不允许抛出checked exception,可以抛出unchecked exception。
所有的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)
太晚了还有其他的方法下次再说。。