Java基础(2)异常
异常
1,异常分析图解
2,异常分析
-
Throwable
- Error 错误
- NoClassDefFoundError 找不到class定义异常
- StackOverfolwError 深递归导致栈被耗尽的异常
- OutOfMemoryError 内存溢出异常
- Exception 异常
- RuntimeException
- Unchecked Exception 非检查异常:不要求强制处理
- NullPointerException 空指针异常
- IndexOutofBoundsException 下标越界异常
- ArithmeticException 算数异常
- ClassCastException 类型转换异常
- IllegalArgumentException 传递非法参数异常
- NumberFormatException 数字格式异常
- 非RuntimeException
- Check Exception 检查异常:必须要处理
- IOException IO异常
- SQLException SQL异常
- ClassNotFoundException 找不到指定class异常
- Error 错误
Error:程序无法处理的系统错误,编译器不做检查。
Exception:程序可以处理的异常,捕获后可能恢复。
总结:前者是程序无法处理的错误,后者是可以处理的异常。
3,异常处理机制
- 捕获异常:try,catch,finally。
- 声明异常:throws。
- 抛出异常:throw。
4,捕获异常
-
try - catch - finally语句块:
-
try - catch 或 try - catch - finally 或 try - finally
-
try 后面可以接0或多个 catch,当没有catch的时候,一定要有finally
注意:
-
finally语句块里面最好不要使用return语句,因为会使前面的try、catch语句块里的return无效。
-
如果有finally块,程序会先执行完finally块里面的代码,再执行return语句,无论return语句在哪里。
-
printStackTrace() --> 打印输出
5,声明异常
throws放在方法后面声明要抛出多个异常类型
注意:
1,如果一个方法throws抛出的是父异常Exception,因为其中包含必须处理的检查异常Check Exception,所以当调用此方法的时候就一定要处理。
2,如果一个方法throws抛出的是Exception的子异常非检查异常,又想要提醒信息,可以使用文档注释。/** */
3,throws定义的异常类型,可以为throw的本类或者其父类。
(throw:ArithmeticException throws ; throws:ArithmeticException / Exception)
6,抛出异常throw
throw用来主动抛出一个异常。如:throw new IOException();
throw抛出的只能是可抛出类Throwable或者其子类的实例对象。
throw主动抛出的异常:
- 要么在抛出的方法内自己try-catch处理;
- 要么方法头部throws声明抛出。
7,异常处理的注意点
- try-catch-finally块,在return前都会执行finally里面的代码。
- 要么本方法内try-catch-finally处理,要么throws抛给调用方处理。
- 要精确的捕获异常的类型,不要敷衍的直接使用Exception。
- 异常处理会消耗性能,所以要精确捕获可能出现异常的代码段,不要笼统的放入一大段代码。
- 不要生吞异常(捕获了什么都不做),会导致出现异常后难以诊断发生问题的地方。
- 异常的效率比ifelse的低。