异常分类:Error、Exception
Error(错误)
比如 StackOverFlowError、OutOfMemeryError等,前者大多发生在方法递归时忘记加上限制条件,后者大多是内存占用过多。Error属于严重错误,必须停止运行。
Exception(异常)
异常分为检查性异常和非检查异常(运行时异常)
- 检查异常:在编译阶段编译器能够检查出来的开发者必须要处理的异常,否则不能通过编译。
- 运行时异常:可以通过编译器的编译,在运行时会产生的异常
常见的异常类型
- ArrayIndexOutOfBoundsException 数组越界异常
- ArithmeticException 算数异常
- NullPointerException 空指针异常
- ClassNotFoundException 类找不到异常
- FileNotFoundException 找不到文件异常
异常处理
异常处理有两种方式:try...catch...和throws。也称为抓抛
try...catch...
语法:
try{
//可能产生异常的代码块
}catch(异常类型 对象名){
//处理异常的代码
}finally{
//代码块
}
其中:catch可以有多个,finall最多有一个,也可以不写。
执行逻辑:
- 首先执行try中的代码块,如果没有异常,则执行finally中的代码块。
- 如果try中的代码块产生了异常,以此对照catch的参数列表中的异常类型,属于哪一类(其子类也可以),就进入哪个catch的代码块执行。执行完成后继续执行finally中的代码块。
注意:
- 若存在多个catch块,则异常类型范围小的放在前面,否则编译报错
- try中的代码块,在产生异常的行之后的代码(即使可能产生异常),不会再执行,直接执行catch块的匹配
- jdk7及以后,catch的小括号中也已使用“|”符号来捕获多种异常,但是必须是同等级别的异常,不能是有继承关系的异常类型
如:catch (ArrayIndexOutOfBoundsException|ArithmeticException e)- 不要将大量的代码放在try中,尽量可以缩小产生异常的范围,否则会影响执行效率
- 通常在finally中进行资源则清除操作,如:关闭文件、删除临时文件等
- finally中的语句,即使try和catch中使用了return或break,也会被执行
- 当try和或catch中执行了System.exit(0)时,finally代码块中的内容不会被执行
throws
throws表示异常抛出给调用者来处理,谁调用谁处理
语法:
修饰符 返回值类型 方法名(参数列表) throws 异常类型1,异常类型2,...{
}
其中:
- throws抛出异常后,调用该方法的方法可以继续使用throws继续抛给它的上层调用方法,知道抛给main方法,如果main方法在throws,就会抛给jvm处理。建议不要抛给jvm来处理。
- throws可以抛出多个异常类型,各个异常类型之间使用逗号隔开
此外,java还提供了throw关键字,用来在代码中人为抛出一个异常对象,一般配合try...catch...或throws使用
throw new Exception();throw new Exception();//表示抛出一个Exception的对象