我们遇到的代码问题有编译异常,有运行时异常,代码问题出现的异常问题都必须要处理,用面向对象的思想看待异常问题,就很容易理解了。
那么如何去描述一个错误呢?
1.错误的名称 类的名称
2.错误的原因
3.错误发生的地点(某个线程,某行代码)
所有的错误都会有一个最终的父类
我们所有的异常对象都可以被抛出throw new XxxxxException();
但是抛出的手段有两种:
1.由JVM直接抛出
JVM会自动检测程序 如果出现异常 则自动创建该异常对象 然后去抛出,JVM自动执行 throw new XxxxxException();
2.我们手动抛出
在代码中手写 throw new XxxxxException();
Throwable分两大类:有异常大小的问题,小会出现运行异常,大则会宕引起宕机。
Error:异常类比较少 但是只要出现都是狠角色
是直接由JVM抛出的一些严重性的错误-主要体现在内存上
OutofHeapError 堆内存溢出(堆没有空间再去创建对象)
StackOverFlowError 栈内存溢出(栈没有空间再去进栈函数)
我们一般不会去操心,这个异常不是我们应该尝试去处理解决的异常
Exception:异常类比较多 所以说没有那么严重
运行时异常:RuntimeException
指的就是只有在程序运行java期间才能出现的错误,它是在编译期间javac检测不到的
ArrayIndexOutofBoundsException
NullPointerException
ClassCastException
......
System.out.println(10/0);
编译时异常:Exception及其其他的子类
就是在编译期间能够被检测出来的可能会发生的错误
在此处可以预防它出错,写一些预备方案
此时还是没有发生的
什么时候发生,只有在运行时才可能发生
一旦该异常发生 则可以选择一些预备方案来解决
所以说我们对编译时异常都会有一个声明,就是告诉调用者,此函数可能会出错
声明:在当前异常发生的函数后面 throws 异常类名
void main() throws XxxException{
show();
}
void show() throws XxxException{
throw new XxxException();//编译时异常
}
声明的意义就是在告诉调用者此函数可能会出现问题,但是没有解决方案。
注:对于运行时异常来说,声明没有任何效果。就已经来不及了
捕获:在当前异常发生的地点 直接将异常处理调 内部消化了
void main(){
show();
}
void show(){
try{ //尝试着去执行某些代码
throw new XxxException();// 编译时异常||运行时异常
} catch(XxxException e) { //一旦try中出现异常 则catch将其捕获
//e = new XxxException();
//在catch里面可以做一些修正的工作
}
}