- 异常体系分类:
- Error 错误
- Exception 异常
- 错误和异常的继承关系:
- 所有错误的父类为 Error 类
- 所有异常的父类为 Exception 类
- Error 和 Exception 的父类为 Throwable
- Throwable:代表可抛出
- 错误类型:
- 编译错误:由编译器找到的错误
String a = 1; //编译错误,没有加引号
- 异常错误:程序给我们提示
Class calzz = Class.forName("com.demo.Animal");
- 逻辑异常:不会报错,但是必须注意到它有异常,这种异常是逻辑产生的
int[] arr = new int[5]; arr[10] = 45; //没有报错,但是必须注意到这个错误
- 栈溢出错误
public static void main(String[] args){ run(); //这里有错误,会产生栈溢出 } public static void run(){ run(); }
- 编译错误:由编译器找到的错误
- Error 错误:
- Error 错误是程序无法处理的错误,它是由 JVM 产生和抛出的
- Exception异常:
- 运行时异常(非受检异常)
- 非运行时异常(受检异常)
- 运行时异常(非受检异常):
- 由逻辑错误引起
- 在编译时异常,必须解决的异常
- 处理受检异常:
- 抛出
- 解决
- 受检异常解决方法:
- try catch 环绕:
- try:找到错误
- catch:处理错误
- finally:不管有没有异常都必须执行的代码块,常用于关闭资源
public static void main(String[] args){ try{ //获取异常 }catch(){ //解决异常 }finally{ // 最终都会走的代码 } }
- 尝试去处理问题,但是处理不了,finally 也能保证后面程序的运行
public static void main(String[] args){ try{ int[] arr = new int[5]; int[10] = 10; //这会有异常 }catch(){ //处理异常 ······ }finally{ //此行代码不管上方有没有错误都会去执行 System.out.println("---------------"); } }
- catch 可以有多个,分别处理不同的情况
public static void main(String[] args){ try{ int[] arr = new int[5]; int[10] = 10; //这会有异常 }catch(ArrayIndexOutOfBoundsException e){ //处理异常 ······ }catch(NegativeArraySizeException e){ //处理异常 }··· }
- 如果不想使用多个 catch,可以用 Exception 把所有异常兜住
public static void main(String[] args){ try{ int[] arr = new int[5]; int[10] = 10; //这会有异常 }catch(Exception e){ //解决所有异常问题 ······ } }
- Exception 类是所有异常类的父类
- 抛出:
- throws:表示此方法不去处理异常,而交给方法调用者进行处理
public class Test{ // 异常抛出 public static void main(String[] args) throws Exception{ } }
- throw:自定义异常
try{ //自定义异常 throw new Exception("自定义异常"); }catch(Exception e){ //打印异常 System.out.println(e); }
- throw 和 throws 区别:
- throws:用来声明一个可能产生的所有异常,不做异常处理而是将异常向上传递,将异常抛给调用者
- throw:用来抛出一个具体的异常类型
- throws:表示此方法不去处理异常,而交给方法调用者进行处理
- try catch 环绕:
- 异常体系整体框架: