1、Java异常
指程序运行时(非编译时)所发生的非正常情况或错误,JVM会将出现的错误表示为一个异常并抛出。
2、异常机制功能
- What:异常回答了什么被抛出
- Where:异常堆栈跟踪回答了在哪抛出
- Why:异常信息回答了为什么被抛出
3、Java异常体系
- Throwable:异常基类,java.lang.Throwable,派生Error(错误)和Exception(异常)两个子类。
- Error:表示程序运行期间出现非常严重的错误,且该错误不可恢复,由于是运行在JVM的错误,会导致程序终止。(JVM责任)
- Exception:程序运行本身异常,编译器可捕获。派生出RuntimeException(运行时异常)和CkeckedException(检查异常)
- RuntimeException:运行异常,编译器没有强制对其捕获处理,当出现这种异常,由JVM来处理。(程序责任)
- 多线程由Thread.run()抛出,异常的线程退出;
- 单线程由main()方法抛出,整个程序退出;
- NullPointerException ---- 空指针异常
- ClassCastException ---- 类转换异常
- ArrayIndexOutOfBoundsException ---- 数组越界异常
- ArrayStoreException ---- 数组存储异常
- BufferOverflowException ---- 缓冲区溢出异常
- ArithmeticException ---- 算术异常
- CheckException:编译期可以检测的异常,如IOException,SQLException,java编译器强制去捕获此类型异常。(Java编译器) 非RuntimeException异常
- ClassNotFoundException:找不到指定class的异常;
- IOException:IO操作异常
- RuntimeException:运行异常,编译器没有强制对其捕获处理,当出现这种异常,由JVM来处理。(程序责任)
import java.io.FileNotFoundException;
public class ErrorAndException {
private void throwError() {
throw new StackOverflowError();
}
private void throwRuntimeException() {
throw new RuntimeException();
}
private void throwCheckedException() {
throw new FileNotFoundException();//编译器报错
}
}
4、常见Error异常
- NoClassDefFoundError:找不到class定义的异常
- 类依赖的class或者jar不存在
- 类文件存在,但是存在不同的域中
- 大小写问题,javac编译的时候是无视大小写
- StackOverflowError:深递归导致栈被耗尽而抛出的异常
- OutOfMemoryError:内存溢出异常
5、Error&Exception区别
- Error:程序无法处理的系统错误,编译器不做检查
- Exception:程序可以处理的异常,捕获后可恢复
总结:前者是无法处理的错误,后者是可以处理的异常。